Ну, до тех пор, пока вы не захотите использовать отражение каким-то странным образом, например, GetType (). GetProperty ("Container" ...), недостатков нет.
Однако считается нечистым выставлять поле, свойство обычно чище с точки зрения пуристов.
FxCop предупредит вас, что это нехорошо, но недостатков нет.
Если вы хотите быть коротким, но чистым одновременно, вы можете просто использовать автоматические свойства:
public static IUnityContainer Container { get; set; }
Однако автоматические свойства работают только с версии 3.0 компилятора.
Возможный недостаток, который может возникнуть, если вы или кто-то передаете это поле byref в какой-либо функции, например, Interlocked.Exchange(ref MyClass.MyStaticField, null);
Это больше не будет работать, если вы измените его со свойством в будущем, поэтому вы должны быть осторожны, не передавая это поле по ссылке. Если вы просто используете свойство с самого начала, у вас не может быть этой проблемы.
Эта проблема не может возникнуть с полями static readonly
, они не могут быть переданы по ссылке. Использование статических полей только для чтения довольно распространено.
Ситуация, когда поля абсолютно не должны использоваться вместо свойств, - это когда у вас есть класс, который наследует MarshalByRefObject, используемый для удаленного взаимодействия (RPC, удаленный вызов процедуры).
Здесь я публикую пример, и, как я уже сказал, это не ваш случай, так как проблема связана с полями экземпляра, а не со статическими полями.
public class MyClass :
MarshalByRefObject
{
public int MyValue;
}
class Program
{
static void Main(string[] args)
{
var obj = new MyClass();
// This will give you warning CS1690: Accessing a member on 'MyValue' may cause a runtime exception because it is a field of a marshal-by-reference class
Console.WriteLine(obj.MyValue.ToString());
}
}
Удаленный вызов процедуры работает только с методами и свойствами, поэтому компилятор выдает предупреждение, поскольку MarshalByRefObject может вызываться внутри другого AppDomain или другого процесса или другого компьютера, например, через TCP / IP.