Класове/конструктори инстанцииране
Привет колеги,
нуждая се от помощ за инстанцирането на класове.
Примерен много опростен клас (абстрахирайте се от евтл синтактични грешки, всичко минава през компилатора ):
class BitArray
{
private BigInteger b;
private int maxIndex=1;
public BitArray(string input)
{ this.b = BigInteger.Parse(input); }
public int MaxIndex { get { return this.maxIndex; } }
}
Проблемът:
Кода (в main метода) долу дава грешка "USe of unassigned local variable b" в последния ред.
BitArray b;
string input;
input = Console.ReadLine();
b = new BitArray(input);
int myIndex = random.Next(b.MaxIndex);
за да тръгне, трябва да направя това (редовете с удивителните) :
BitArray b;
BitArray myBit = new BitArray("0"); !!!!!!!!!!
string input;
input = Console.ReadLine();
b = new BitArray(input);
myBit = b; !!!!!!!!!
int myIndex = random.Next(myBit.MaxIndex); !!!!!!!!!!!!!!!!!!
Въпросът ми е защо компилатора мрънка за първия варинат, нали b = new BitArray(input); вика конструктора , респективно инициализира променливата????
навик от по-стари езици, но не бих се съгласил с определението "порочна практика"
Променливите се използат в различни конструкции и за мен пък точно декларирането непосредствено преди използването прави кода нечетивен.
Говоря за локални променливи. Ако спазваш останалите правила - методът ти да не е много дълъг, например не по-дълъг от 15 реда, то не би трябвало да е нечетим кодът. Още повече ако в тези 15 реда изпозваш 10 нови променливи това ще вдигне редовете до 25, ако са декларирани най-отгоре.
Другото е, че това създава неконсистенция. Или ги декларирай така, или иначе. Обаче ако трябва да им инициализираш стойност в условни конструкции вече става друг бира.
http://codereview.stackexchange.com/questions/6283/variable-declaration-closer-to-usage-vs-declaring-at-the-top-of-method
В КПК учим един принцип, който казва, че lifespan на една променлива трябва да е минимален, т.е. броят редове в кода между декларацията на променливата и първото й използване трябва да е максимално кратък. Ако между редове 2 и 44 не полваш променливата Х, защо ти е да я имаш декларирана на ред 2? Ако кодът е дълъг това създава неудобства.
Това са навици от по-стари езици, които по-добре да се ползват пестеливо. Подобно хойстване на променливи се прави само в JS към момента, но там си има добра причина - така или иначе всички променливи се хойстват и са достъпни още от самото начало на изпълнение на кода, с цел яснота е по-добре и декларациите им в кода да са най-отгоре, за да не се чуди някой по-неопитен програмист какво се случва.