Инициализация значений по умолчанию для закрытых полей в конструкторах явно. WTF? - PullRequest
1 голос
/ 31 августа 2010

Рассмотрим следующий фрагмент кода из библиотеки .NET 4.0:

private T[] array; 
private static T[] emptyArray; 
private int size; 
private int version; 

static Stack() 
{ 
    Stack<T>.emptyArray = new T[0]; 
} 

public Stack() 
{ 
    array = Stack<T>.emptyArray; 
    size = 0; 
    version = 0; 
}

Есть ли какая-либо причина, по которой инициализация закрытых полей типа значения к значениям по умолчанию (size и version в примере выше) явнокроме стандартов кодирования компании?

Ответы [ 4 ]

1 голос
/ 31 августа 2010

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

1 голос
/ 31 августа 2010

IMO, нет необходимости или выгоды инициализировать частные переменные для их значений по умолчанию (если это не является частью стандартов).

Изменить: несколько раз, это может иметь смысл (поскольку это улучшает читабельность кода) - например,

public const OP_GET = 0;
public const OP_ADD = 1;
...

private int operation = OP_GET;
1 голос
/ 31 августа 2010

Если они относятся к примитивному типу данных, вам не нужно инициализировать, они всегда будут принимать значение по умолчанию

int, long и т. Д. Всегда будут иметь значение по умолчанию, равное 0, в то время как bool будет иметь значение false и т. Д.

если это ссылочный тип, вам, возможно, придется инициализировать, чтобы они имели какое-то значение по умолчанию (согласно вашей логике) и избегали ошибок Null Reference

1 голос
/ 31 августа 2010

Я думаю, что обычно рекомендуется инициализировать коллекции, прежде всего потому, что это гарантирует разработчику, что ему не нужно ничего инициализировать при использовании, и просто предполагает, что переменная была инициализирована.

public class Store
{
    public Store()
    {
        // Ready to go!
        Products = new List<Product>();
    }

    public string Id {get;set;}
    public IList<Product> Products {get;set;}
}

Вы перепрыгиваете через необходимость проверить, была ли инициализирована коллекция, если нет, иначе ... зевать

...