null странно

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

null странно

Сообщение _user_ 28 ноя 2021, 13:18

Всем привет! Такой вот баг произошел.
Есть некий класс Figure:
Синтаксис:
Используется csharp
class Figure : MonoBehaviour
{
    private readonly byte index;
    private readonly Transform position;
    public Figure(in byte index, in Transform position) //конструктор класса
    {
        this.index = index;
        this.position = position;
    }
}
 


И есть другой класс, который содержит Figure:
Синтаксис:
Используется csharp
class otherClass : MonoBehaviour
{
    private Figure[] figures;
    public void InitializeFigures(in byte count, in Transform thisTransform)
    {
        figures = new Figure[count];
        for (byte i = 0; i < count; i++)
        {
            Debug.Log("1) figures[i] = " + figures[i]); //Вывод - "1) figures[i] =  "
            figures[i] = new Figure(i, transform);
            Debug.Log("2) figures[i] = " + figures[i]); //Вывод - "2) figures[i] =  null" //Почему null
        }
    }
}
 


Почему во втором выводе может быть null, если я создаю новый экземпляр класса Figure?
Последний раз редактировалось _user_ 29 ноя 2021, 18:53, всего редактировалось 2 раз(а).
_user_
UNец
 
Сообщения: 37
Зарегистрирован: 16 июл 2021, 19:35

Re: null странно

Сообщение samana 28 ноя 2021, 14:16

Синтаксис:
Используется csharp
figures[i] = new Figure(i, transform);

Но у класса otherClass нет свойства transform, там вообще должно выводится исключение.
Может вы мели ввиду?
Синтаксис:
Используется csharp
figures[i] = new Figure(i, thisTransform);
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: null странно

Сообщение _user_ 28 ноя 2021, 14:31

Только класс otherClass висит на игровом объекте, что означает, что у него есть transform (компонент Transform на этом же объекте). Только всё таки почем null?
_user_
UNец
 
Сообщения: 37
Зарегистрирован: 16 июл 2021, 19:35

Re: null странно

Сообщение _user_ 28 ноя 2021, 14:33

_user_ писал(а):Только класс otherClass висит на игровом объекте, что означает, что у него есть transform (компонент Transform на этом же объекте). Только всё таки почем null?

По факту вот так будет выглядеть:
Синтаксис:
Используется csharp
class otherClass : MonoBehaviour
{
    private Transform transform;
    private Figure[] figures;
    private void Start()
    {
        transform = gameObject.GetComponent<Transform>();
    }
    public void InitializeFigures(in byte count, in Transform thisTransform)
    {
        figures = new Figure[count];
        for (byte i = 0; i < count; i++)
        {
            Debug.Log("1) figures[i] = " + figures[i]); //Вывод - "1) figures[i] =  "
            figures[i] = new Figure(i, transform);
            Debug.Log("2) figures[i] = " + figures[i]); //Вывод - "2) figures[i] =  null" //Почему null
        }
    }
}
 
Последний раз редактировалось _user_ 28 ноя 2021, 18:08, всего редактировалось 1 раз.
_user_
UNец
 
Сообщения: 37
Зарегистрирован: 16 июл 2021, 19:35

Re: null странно

Сообщение Xtir 28 ноя 2021, 17:48

Как он может висеть на объекте, если он даже не наследуются от MonoBehaviour?
Xtir
UNIверсал
 
Сообщения: 498
Зарегистрирован: 21 окт 2016, 00:37

Re: null странно

Сообщение _user_ 28 ноя 2021, 18:08

Это я как пример писал, с реального шаблона. Сейчас исправлю.
_user_
UNец
 
Сообщения: 37
Зарегистрирован: 16 июл 2021, 19:35

Re: null странно

Сообщение samana 28 ноя 2021, 20:26

Запустил ваш код

Синтаксис:
Используется csharp
using UnityEngine;

public class otherClass : MonoBehaviour
{
    void Start()
    {
        InitializeFigures(3, transform);
    }

    private Figure[] figures;
    public void InitializeFigures(in byte count, in Transform thisTransform)
    {
        figures = new Figure[count];
        for (byte i = 0; i < count; i++)
        {
            Debug.Log("1) figures[i] = " + figures[i]);
            figures[i] = new Figure(i, transform);
            Debug.Log("2) figures[i] = " + figures[i]); //figures[i] =  Figure"
        }
    }
}
public class Figure
{
    private readonly byte index;
    private readonly Transform position;
    public Figure(in byte index, in Transform position) //конструктор класса
    {
        this.index = index;
        this.position = position;
    }
}


Никаких null-ов нет, всё работает нормально.

И ещё какая-то подозрительная фишка с модификатором in для параметров метода. Вы точно знаете, что он делает и что в этом есть необходимость?
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: null странно

Сообщение _user_ 29 ноя 2021, 17:40

samana писал(а):Запустил ваш код

Синтаксис:
Используется csharp
using UnityEngine;

public class otherClass : MonoBehaviour
{
    void Start()
    {
        InitializeFigures(3, transform);
    }

    private Figure[] figures;
    public void InitializeFigures(in byte count, in Transform thisTransform)
    {
        figures = new Figure[count];
        for (byte i = 0; i < count; i++)
        {
            Debug.Log("1) figures[i] = " + figures[i]);
            figures[i] = new Figure(i, transform);
            Debug.Log("2) figures[i] = " + figures[i]); //figures[i] =  Figure"
        }
    }
}
public class Figure
{
    private readonly byte index;
    private readonly Transform position;
    public Figure(in byte index, in Transform position) //конструктор класса
    {
        this.index = index;
        this.position = position;
    }
}


Никаких null-ов нет, всё работает нормально.

И ещё какая-то подозрительная фишка с модификатором in для параметров метода. Вы точно знаете, что он делает и что в этом есть необходимость?


Значит у меня сборщик мусора гребёт? модификатор in - ссылка на данные, не копируя эти данные в промежуточную переменную. Вот если что урок - https://www.youtube.com/watch?v=4Z6e-qw ... N&index=61
Только проблема в том, что даже без in код не рабортает(возвращается null).
_user_
UNец
 
Сообщения: 37
Зарегистрирован: 16 июл 2021, 19:35

Re: null странно

Сообщение 1max1 29 ноя 2021, 18:34

Здесь либо код неполный, либо ты неверно понимаешь консольный вывод.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: null странно

Сообщение _user_ 29 ноя 2021, 18:38

Конечно код не полный, я вытащил только ту часть, в которой должна быть ошибка. Ладно, попробую всё переписать, что получится, напишу.
_user_
UNец
 
Сообщения: 37
Зарегистрирован: 16 июл 2021, 19:35

Re: null странно

Сообщение _user_ 29 ноя 2021, 18:52

Нашел решение!!!
Оказалось, что:
Синтаксис:
Используется csharp
class otherClass : MonoBehaviour
{
    ****
            figures[i] = <span style="text-decoration: underline">new</span> Figure(i, transform); //new - подчёркивалось в visual studio, код - UNT0010
    ****
}
 

посмотрел этот код в гугле, класс Figure не может наследоваться от MonoBehaviour в этом случае.
Спасибо всем!
_user_
UNец
 
Сообщения: 37
Зарегистрирован: 16 июл 2021, 19:35

Re: null странно

Сообщение 1max1 30 ноя 2021, 00:21

Вообще-то может, но создавать MonoBehaviour через new не надо.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 27