まあ、GetType()、GetProperty( "Container" ...)などのようないくつかの変わった方法でリフレクションを使用したくない場合は、欠点はありません。
しかし、フィールドを公開することは汚れていると考えられ、プロパティは通常、純粋な観点からはよりクリーンです。
FxCopは素晴らしいことではないことを警告しますが、欠点はありません。
あなたが同じ時間に短いがきれいになりたい場合は、あなただけの自動プロパティを使用することができます
public static IUnityContainer Container { get; set; }
自動プロパティをしかし、コンパイラのバージョン3.0以降のみ動作します。
ある可能性のある欠点は、あるフィールドで、たとえば、Interlocked.Exchange(ref MyClass.MyStaticField, null);
のように、フィールドまたはbyrefをそのフィールドに渡す場合です。今後プロパティで変更した場合はもう機能しませんので注意してくださいそのフィールドを参照渡ししません。最初からプロパティを使用するだけであれば、この問題は発生しません。 この問題はstatic readonly
フィールドでは発生しません。これらのフィールドは参照渡しできません。静的な読み取り専用フィールドの使用は非常に一般的です。
プロパティの代わりに絶対にフィールドを使用しない状況は、リモート処理(RPC、リモートプロシージャコール)に使用されるMarshalByRefObjectを継承するクラスを持つ場合です。
ここで私は例を挙げていますが、問題はインスタンスフィールドであり、静的フィールドではないため、あなたのケースではありません。
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を介して、他のプロセスまたは別のコンピュータで呼び出すことができるので、コンパイラは、あなたに警告を与えるこのような理由のために、メソッドとプロパティでのみ動作します。
これはまったく同じです。詳細については、[こちら](http://stackoverflow.com/questions/7280502/c-sharp-automatic-properties-are-they-safe-for-enterprise-development/7280544#7280544)を参照してください。 – CodeCaster
全く同じではありません。ここで彼はフィールドVSについて話していますが、これは単純なGoogleを介して何百ものディスカッションがあります。あなたのリンクは自動プロパティとその違いについて話します。 –
@CodeCasterまったく同じではありません。あなたのリンクは、実装されたマニュアルと同じであることを示していますが、この質問ではフィールドとプロパティです。 – DanielB