Просто мысль я совместно использовал бы свои результаты по этой теме.
Кодирование свойства как следующее, вызов ярлыка .net 3.0 “ автореализованное свойство ”.
public int MyProperty { get; set; }
Это сохраняет Вас некоторый ввод. Длинный путь для объявления свойства похож на это:
private int myProperty;
public int MyProperty
{
get { return myProperty; }
set { myProperty = value; }
}
при использовании “auto-реализованного property” компилятор генерирует код, чтобы обеспечить электричеством получать и установить на некоторый “k_BackingField”. Ниже демонтированный код с помощью Отражателя.
public int MyProperty
{
[CompilerGenerated]
get
{
return this.<MyProperty>k__BackingField;
}
[CompilerGenerated]
set
{
this.<MyProperty>k__BackingField = value;
}
}
демонтировал код C# от IL
, Также обеспечивает электричеством метод для метода set и метода get.
[CompilerGenerated]
public void set_MyProperty(int value)
{
this.<MyProperty>k__BackingField = value;
}
[CompilerGenerated]
public int get_MyProperty()
{
return this.<MyProperty>k__BackingField;
}
демонтировал код C# от IL
, Когда Вы объявляете автореализованное свойство только для чтения путем установки метода set на частный:
public int MyProperty { get; private set; }
Весь компилятор действительно отмечает" , устанавливает " как частный. Метод установщика и метод получателя говорят то же.
public int MyProperty
{
[CompilerGenerated]
get
{
return this.<MyProperty>k__BackingField;
}
private [CompilerGenerated]
set
{
this.<MyProperty>k__BackingField = value;
}
}
демонтировал код C# от IL
, Таким образом, я не уверен, почему платформа требует обоих получать; и набор; на автореализованном свойстве. Они, возможно, не просто записали метод установки и метод установщика, если это не было предоставлено. Но может быть некоторая проблема уровня компилятора, которая делает это трудным, я не знаю.
, Если Вы смотрите на длинный путь объявить свойство только для чтения:
public int myProperty = 0;
public int MyProperty
{
get { return myProperty; }
}
И затем смотрят на демонтированный код. Метод set не там вообще.
public int Test2
{
get
{
return this._test;
}
}
public int get_Test2()
{
return this._test;
}
демонтировал код C# от IL
It's equivalent to
"zdvnngfgnfg"[3];
which is legal and means "take the address of that literal and add 3*sizeof(char)
to it". Will have no effect anyway.
Also see this very similar question.
arr[i] is parsed as *(arr+i) which can be written as *(i+arr) and hence i[arr]
Now "strngjwdgd" is a pointer to a constant character array stored at read only location.
so it works!!
The string literal(array
) decays to a pointer of type char*
. Then you take the fourth element:
3["zdvnngfgnfg"] == "zdvnngfgnfg"[3]
Why you can write the subscript infront of the array is another question: