Я все еще пишу код для систем, которые не имеют поддержки с плавающей точкой в аппаратных средствах. В этих системах Вам нужно смещение бита почти для всей Вашей арифметики.
Также Вам нужны сдвиги для генерации хешей. Полиномиальная арифметика (CRC, Коды Тростника-Solomon являются основными приложениями), или сдвиги использования также.
Однако сдвиги просто используются, потому что они удобны и выражают точно, что предназначил писатель. Можно эмулировать все сдвиги разряда с умножением, если бы Вы хотите, но это было бы более трудно записать, менее читаемый и иногда медленнее.
компиляторы обнаруживают случаи, где умножение может быть уменьшено до сдвига.
Однако вы назначаете в неправильный статический конструктор . Он может быть назначен только в статическом конструкторе для типа, объявляющего переменную .
Предположим, у вас есть другой класс, производный от ClassC, который делает то же самое - вы в конечном итоге перезаписываете переменную, которая является предназначен только для чтения. Здесь есть единственная статическая переменная, однако у вас есть много производных классов.
Один из ответов - избегать использования статической переменной , но поместить виртуальное свойство ] в базовом классе и заставит каждый производный класс переопределять свойство для возврата другой константы:
public class ClassA
{
public virtual string ProcessName { get { return "ClassAProcess"; } }
}
public class ClassB : ClassA
{
public override string ProcessName { get { return "MyProcess.exe"; } }
}
В основном вариант состоит в том, чтобы отделить «статический»
В вашем примере будет существовать только одно поле, поле базового класса, и вы не можете иметь разные значения в одном поле. Кроме того, вы можете инициализировать поля только для чтения
в том же классе, но не в производных классах. Обходной путь может заключаться в определении общего класса, например:
static class ProcessNames<T> {
public static string Value { get; set; }
}
, и использовании вместо него ProcessNames
. Очевидно, что таким образом значение будет общедоступным.
Однако вы должны увидеть, соответствует ли определение поля в каждом производном классе отдельно вашим потребностям, и прибегать к обходным путям, только если это не так.
Есть много способов снять шкуру с кошки. Вот еще один способ сделать это.
public class ClassA
{
public string ProcessName{ get; private set;}
public ClassA()
{
ProcessName = "ClassAProcess";
}
public ClassA(string processName)
{
ProcessName = processName;
}
}
public class ClassB : ClassA
{
public ClassB() : base("ClassAProcess")
{
}
}