Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Можно ли переменной импа int задать значение null?


Автор: STRELOKBMSTU 2.9.2007, 23:11
Можно ли переменной импа int задать значение null? Если можно, то как это сделать?

Автор: HalkaR 2.9.2007, 23:34
Нет. Но специально для решения данной проблемы в .Net есть тип Nullable. Т.е. в вашем случае это выглядит так
Код

int? a = null;
int? b = 10;

Автор: SpaceSpace 3.9.2007, 09:32
теоретически, просто происходит упаковка значимого типа, но не в object, а в класс Nullable,
т.е. int? перестает быть значимым, становится ссылочным и храниться соответсвеннон не в стеке , а в куче

Автор: HalkaR 3.9.2007, 09:39
Цитата(SpaceSpace @ 3.9.2007,  09:32)
теоретически, просто происходит упаковка значимого типа, но не в object, а в класс Nullable,
т.е. int? перестает быть значимым, становится ссылочным и храниться соответсвеннон не в стеке , а в куче

Вот исходник типа Nullable:
Код

[Serializable, StructLayout(LayoutKind.Sequential), TypeDependency("System.Collections.Generic.NullableComparer`1"), TypeDependency("System.Collections.Generic.NullableEqualityComparer`1")]
public struct Nullable<T> where T: struct
{
    private bool hasValue;
    internal T value;
    public Nullable(T value)
    {
        this.value = value;
        this.hasValue = true;
    }

    public bool HasValue
    {
        get
        {
            return this.hasValue;
        }
    }
    public T Value
    {
        get
        {
            if (!this.HasValue)
            {
                ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
            }
            return this.value;
        }
    }
    public T GetValueOrDefault()
    {
        return this.value;
    }

    public T GetValueOrDefault(T defaultValue)
    {
        if (!this.HasValue)
        {
            return defaultValue;
        }
        return this.value;
    }

    public override bool Equals(object other)
    {
        if (!this.HasValue)
        {
            return (other == null);
        }
        if (other == null)
        {
            return false;
        }
        return this.value.Equals(other);
    }

    public override int GetHashCode()
    {
        if (!this.HasValue)
        {
            return 0;
        }
        return this.value.GetHashCode();
    }

    public override string ToString()
    {
        if (!this.HasValue)
        {
            return "";
        }
        return this.value.ToString();
    }

    public static implicit operator T?(T value)
    {
        return new T?(value);
    }

    public static explicit operator T(T? value)
    {
        return value.Value;
    }
}

Это -структура, т.е. value тип, так что никакой упаковки не происходит.

Автор: SpaceSpace 3.9.2007, 09:42
HalkaR
очень убедительный аргумент, НО
Код

public override bool Equals(object other)
    {
        if (!this.HasValue)
        {
            return (other == null);
        }
        if (other == null)
        {
            return false;
        }
        return this.value.Equals(other);
    }

    public override int GetHashCode()
    {
        if (!this.HasValue)
        {
            return 0;
        }
        return this.value.GetHashCode();
    }

    public override string ToString()
    {
        if (!this.HasValue)
        {
            return "";
        }
        return this.value.ToString();
    }


не напоминают ли тебе эти оверрайды object ? smile 

если сможешь меня переубедить - дам по репе smile smile

кста,
структуры - не всегда в стэке храняться,
у них ограничение на максимальный размер

и вообще, чтобы дженерики были value -- это нонсенс smile 

или у меня настолько сильные пробелы в теории? smile 

Автор: QryStaL 3.9.2007, 10:15
Ну, все правильно. Структуры неявно наследуются от System.ValueType, а тот в свою очередь от System.Object. Поэтому наследуют все методы object.

Цитата(SpaceSpace @  3.9.2007,  09:42 Найти цитируемый пост)
чтобы дженерики были value -- это нонсенс

Не вижу никаких оснований так считать.

Автор: SpaceSpace 3.9.2007, 10:29
ну.. в общем я подумал.... почитал..
скорее всего мои догадки были неверны smile 

Корень моего незнания - в том что меня переклинило и я попутал object c System.Object 

поэтому прошу прошения за дезинформацию,
Nullable - value, лежит в куче

Автор: HalkaR 3.9.2007, 10:36
Цитата(SpaceSpace @ 3.9.2007,  10:29)
Корень моего незнания - в том что меня переклинило и я попутал object c System.Object 

object и System.Object суть одно и тоже - синонимы это.
А то, что неявняе наследники reference типа могут быть value типами - ничего удивительного.

Автор: QryStaL 3.9.2007, 10:38
Цитата(SpaceSpace @  3.9.2007,  10:29 Найти цитируемый пост)
попутал object c System.Object 


Это одно и то же

Автор: HalkaR 3.9.2007, 10:38
Цитата(SpaceSpace @  3.9.2007,  09:42 Найти цитируемый пост)
структуры - не всегда в стэке храняться,
Всегда, если они неупакованны.

Цитата(SpaceSpace @  3.9.2007,  09:42 Найти цитируемый пост)
и вообще, чтобы дженерики были value -- это нонсенс

Никакого нонсенса smile
Цитата(SpaceSpace @  3.9.2007,  09:42 Найти цитируемый пост)
или у меня настолько сильные пробелы в теории?
Похоже что да. smile

Автор: SpaceSpace 3.9.2007, 10:49
Цитата

А то, что неявняе наследники reference типа могут быть value типами - ничего удивительного.


вот это и есть мой пробел
спасибо за инфу

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)