Я предпочитаю это решение, используя модуль 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'
.
ОШИБКА: свойство или индексатор не могут быть переданы как или касательно параметра
, Если бы Вы не определили {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.
Также у Вас могут быть различные модификаторы доступа для того, чтобы получать & набор, например, {добираются; частный набор;} делает получить общественность и набор частный к классу объявления.
Поскольку Вы могли бы хотеть свойство только для чтения:
public int Foo { get; private set; }
Или свойство Только для записи:
public int Foo { private get; set; }
Поскольку Вам нужен некоторый способ отличить его от простых полей.
также полезно иметь различные модификаторы доступа, например,
public int MyProperty { get; private set; }
Компилятор должен знать, хотите ли Вы, чтобы он генерировал метода get и/или метод set, или возможно объявляете поле.
Просто мысль я совместно использовал бы свои результаты по этой теме.
Кодирование свойства как следующее, вызов ярлыка .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
Если бы свойство не имело средств доступа, как компилятор разделил бы его от поля? И что разделило бы его от поля?
Ну, очевидно, Вам нужен способ снять неоднозначность между полями и свойствами. Но действительно необходимы требуемые ключевые слова? Например, ясно, что эти два объявления отличаются:
public int Foo;
public int Bar { }
, Который мог работать. Таким образом, это - синтаксис, который мог очевидно понять компилятор.
, Но тогда Вы добираетесь до ситуации, где пустой блок имеет семантическое значение. Это кажется сомнительным.