Существует ли лучший способ записать эту строку кода C# в C#3.0?

На самом деле ссылка действительно не похожа на указатель.

компилятор А сохраняет "ссылки" на переменные, связывая имя с адресом памяти; это - его задание для перевода любого имени переменной в адрес памяти при компиляции.

при создании ссылки Вы только говорите компилятору о присвоении другого имени к переменной указателя; вот почему ссылки не могут "указать на пустой указатель", потому что переменная не может быть и не быть.

Указатели являются переменными; они содержат адрес некоторой другой переменной или могут быть пустыми. Важная вещь состоит в том, что указатель имеет значение, в то время как ссылка только имеет переменную, на которую это ссылается.

Теперь некоторое объяснение реального кода:

int a = 0;
int& b = a;

Вот, пожалуйста не создание другой переменной, которая указывает на a; Вы просто добавляете другое имя к содержанию памяти, содержащему значение a. Эта память теперь имеет два имени, a и b, и она может быть обращена с помощью любого имени.

void increment(int& n)
{
    n = n + 1;
}

int a;
increment(a);

При вызывании функции, компилятор обычно генерирует пространства памяти для аргументов, которые будут скопированы в. Функциональная подпись определяет пространства, которые должны быть созданы и дают имя, которое должно использоваться для этих пробелов. При объявлении параметра, поскольку ссылка просто говорит компилятору использовать пространство памяти входной переменной вместо того, чтобы выделить новое пространство памяти во время вызова метода. Может казаться странным сказать, что Ваша функция будет непосредственно управлять переменной, объявленной в объеме вызова, но помнить что при выполнении скомпилированного кода, больше нет объема; существует просто сплошная память, и Ваш функциональный код мог управлять любыми переменными.

Теперь могут быть некоторые случаи, где Ваш компилятор не может быть в состоянии знать ссылку при компиляции, как при использовании переменной экстерна. Таким образом, ссылка может или не может быть реализована как указатель в базовом коде. Но в примерах я дал Вам, это не будет, скорее всего, реализовано с указателем.

5
задан mezoid 7 August 2009 в 04:25
поделиться

5 ответов

Вы можете использовать Nullable .ToString () переопределить ...

var s = MyProperty.ToString(); // returns "" if MyProperty is null
15
ответ дан 18 December 2019 в 08:29
поделиться

Вы можете использовать HasValue вместо сравнения:

MyProperty.HasValue ? MyProperty.Value.ToString() : null;
1
ответ дан 18 December 2019 в 08:29
поделиться

Сделать строку получить свойства класса, содержащего это свойство, и это не будет беспорядком, когда вам понадобится получить строковую версию.

    public decimal? MyProperty { get; set; }

    public string MyPropertyString
    {
        get
        {
            return MyProperty.HasValue ? MyProperty.Value.ToString() : null;
        }
    }
1
ответ дан 18 December 2019 в 08:29
поделиться

Если это нормально, иметь нулевое значение istead значения null, тогда:

(MyProperty ?? 0).ToString()

В противном случае добавьте метод расширения:

public static string AsString(this decimal? val)
{
    return val == null ? null : val.Value.ToString();
}

// Use:
MyProperty.AsString() // This will NEVER cause NullReferenceException
1
ответ дан 18 December 2019 в 08:29
поделиться

Вы можете объявить метод расширения в Decimal.

public static string Str(this decimal? value)
{
    return value == null ? null : MyProperty.ToString()
}

Затем вы вызываете его так:

MyProperty.Str()
1
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: