Почему этот отрывок является компилируемым в C? [дубликат]

Просто мысль я совместно использовал бы свои результаты по этой теме.

Кодирование свойства как следующее, вызов ярлыка .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

5
задан Community 23 May 2017 в 12:07
поделиться

3 ответа

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.

8
ответ дан 18 December 2019 в 10:46
поделиться

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!!

6
ответ дан 18 December 2019 в 10:46
поделиться

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:

In C arrays why is this true?

2
ответ дан 18 December 2019 в 10:46
поделиться