C# Автоматические Свойства - Почему, я должен Записать, “добираются; набор”;?

Я предпочитаю это решение, используя модуль csv из стандартной библиотеки и оператор with , чтобы не оставлять файл открытым.

Ключевым моментом является использование 'a' для добавления при открытии файла.

import csv   
fields=['first','second','third']
with open(r'name', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(fields)

В Windows могут возникнуть лишние новые строки. Вы можете попытаться избежать их, используя 'ab' вместо 'a'.

43
задан AnthonyWJones 19 December 2008 в 20:54
поделиться

7 ответов

ОШИБКА: свойство или индексатор не могут быть переданы как или касательно параметра

, Если бы Вы не определили {get; set;} тогда, то компилятор не знал бы, является ли это поле или свойство. Это - важный becasue, в то время как они "выглядят" идентичными, компилятор рассматривает их по-другому. например, Вызов "InitAnInt" на свойстве повышает ошибку.

class Test
{
    public int n;
    public int i { get; set; }
    public void InitAnInt(out int p)
    {
        p = 100;
    }
    public Test()
    {
        InitAnInt(out n); // This is OK
        InitAnInt(out i); // ERROR: A property or indexer may not be passed 
                          // as an out or ref parameter
    }
}

Вы не должны создавать общедоступные поля/Переменные на классах, Вы никогда не знаете, когда Вы захотите измениться, это для имения получает & средства доступа набора, и затем Вы не знаете то, что кодирует, Вы собираетесь повредиться, особенно если у Вас есть клиенты что программа против Вашего API.

Также у Вас могут быть различные модификаторы доступа для того, чтобы получать & набор, например, {добираются; частный набор;} делает получить общественность и набор частный к классу объявления.

52
ответ дан Binary Worrier 23 September 2019 в 12:01
поделиться

Поскольку Вы могли бы хотеть свойство только для чтения:

public int Foo { get; private set; }

Или свойство Только для записи:

public int Foo { private get; set; }
63
ответ дан vivek nuna 23 September 2019 в 12:01
поделиться

Поскольку Вам нужен некоторый способ отличить его от простых полей.

также полезно иметь различные модификаторы доступа, например,

public int MyProperty { get; private set; }
16
ответ дан Cristian Libardo 23 September 2019 в 12:01
поделиться

Компилятор должен знать, хотите ли Вы, чтобы он генерировал метода get и/или метод set, или возможно объявляете поле.

4
ответ дан Kris 23 September 2019 в 12:01
поделиться

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

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

16
ответ дан Ron Todosichuk 23 September 2019 в 12:01
поделиться

Если бы свойство не имело средств доступа, как компилятор разделил бы его от поля? И что разделило бы его от поля?

2
ответ дан Rune Grimstad 23 September 2019 в 12:01
поделиться

Ну, очевидно, Вам нужен способ снять неоднозначность между полями и свойствами. Но действительно необходимы требуемые ключевые слова? Например, ясно, что эти два объявления отличаются:

public int Foo;
public int Bar { }

, Который мог работать. Таким образом, это - синтаксис, который мог очевидно понять компилятор.

, Но тогда Вы добираетесь до ситуации, где пустой блок имеет семантическое значение. Это кажется сомнительным.

2
ответ дан Robert Rossney 23 September 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: