System.String
строковый класс.NET - в C# string
, псевдоним для System.String
- таким образом используемый, они - то же.
Что касается инструкций я не слишком сорвать и просто использовать, какой бы ни Вы чувствуете себя подобно - существуют более важные вещи в жизни, и код будет тем же так или иначе.
, Если Вы создаете системы, где необходимо определить размер целых чисел, Вы используете и так будьте склонны использовать Int16
, Int32
, UInt16
, UInt32
и т.д. тогда могло бы выглядеть более естественным использовать String
- и при перемещении между различными .net языками, это могло бы сделать вещи более понятными - иначе я буду использовать строку и интервал
Я ожидаю, что вы можете вызывать статические методы в списке параметров конструктора базового класса.
public class DerivedClass : BaseClass
{
public DerivedClass(int i)
: base(ChooseInputType(i))
{
}
private static InputType ChooseInputType(int i)
{
// Logic
return InputType.Number;
}
}
Вы можете создать статический метод в производном классе и поместите туда свою логику:
public enum InputType {
Number = 1,
String = 2,
Date = 3
}
public class BaseClass {
public BaseClass(InputType t) {
// Logic
}
}
public class DerivedClass : BaseClass {
public DerivedClass(int i)
: base(GetInputType(i)) {
// Is it possible to set "value" here?
// Logic
}
private static InputType GetInputType(Int32 parameter) {
// Do something with parameter
// and return an InputType
return (InputType)Enum.Parse(typeof(InputType), parameter);
}
}
Вы можете использовать статический метод для вычисления значения, которое будет передаваться базовому конструктору.
public class DerivedClass :
BaseClass
{
public
DerivedClass(int i) :
base(ComputedValue(i))
{
}
public static InputType
ComputedValue(int i)
{
return InputType.Number; // or any other computation you want here
}
}
Да. Можно использовать обычные выражения, которые не обращаются к экземпляру, для управления значением. Например,
public DerivedClass(int i)
: base((InputType)i)
{
}
Один из способов поместить произвольную логику в предложение base ()
без введения отдельного статического метода - это использовать лямбда-выражение или анонимный делегат. Выражение внутри base ()
входит в область видимости всех параметров конструктора, поэтому вы можете свободно использовать их внутри лямбда-выражения. Например (скажем, это C # 2.0, поэтому нет LINQ для написания однострочника для одного и того же):
class Base
{
public Base(int[] xs) {}
}
class Derived : Base
{
public Derived(int first, int last)
: base(
((Func<int[]>)delegate
{
List<int> xs = new List<int>();
for (int x = first; x < last; ++x)
{
xs.Add(x);
}
return xs.ToArray();
})())
{
}
}
Однако я настоятельно не рекомендую использовать это на практике, потому что с точки зрения удобочитаемости это действительно ужасно. . При использовании статического метода вам необходимо явно передать ему аргументы конструктора, но обычно у вас их не более 3-4.
Нет.
Базовый конструктор запускается до любой логики в конструкторе DerivedClass, поэтому нет возможности внедрить логику.
Вы можете,
Вы говорите
Я понимаю, что не могу вызовите производный конструктор перед вызовом базового конструктора
Но затем вы покажете этот код
public DerivedClass(int i)
: base(value)
{
// Is it possible to set "value" here?
// Logic
}
Когда этот кодовый блок введен, вы уже запустили конструктор базового класса. Однако вы можете изменить значение в выражении перед передачей его базовому конструктору (с некоторыми очевидными ограничениями). Однако у вас не будет доступа к «значению», если оно не является входом в конструктор.