4

この質問は、Jon Skeetの回答に触発され ています。c++のアクセス修飾子領域に相当するac#はありますか?

彼は、ファイル内のフィールドの順序が重要になる可能性があるとコメントしています。これはフィールドが初期化される順序に関係していると思いますが、この副作用に基づいてコーディングするのは危険であり、独自の質問と議論が必要だと思います。

コードファイル内のフィールドの順序を操作する方法と、それがどのような影響を与える可能性があるかについて、他に考えがありますか?

4

6 に答える 6

25

これは、C#言語仕様(セクション10.5.5)の典型的な例です。

class Test
{
    static int a = b + 1;
    static int b = a + 1;
    static void Main() {
        Console.WriteLine("a = {0}, b = {1}", a, b);
    }
}

これは完全に有効なプログラムであり、記述されているとおりです(a = 1、b = 2)。ただし、フィールドの順序を入れ替えると、値も入れ替えられます。

于 2009-01-10T16:15:07.153 に答える
3

ええ、管理されていないコードとインターフェースするときは重要です。

于 2009-01-10T16:08:26.590 に答える
2

私は主に初期化の順序について考えていました。そうです、特に静的フィールドの場合です。たとえば(デモンストレーションを簡単にするためにパブリックフィールドを使用):

using System;

class First
{
    static int a = 10;
    public static int b = CalculateB();
    static int c = 5;

    static int CalculateB()
    {
        return a*c;
    }
}

class Second
{
    static int a = 10;
    static int c = 5;
    public static int b = CalculateB();

    static int CalculateB()
    {
        return a*c;       
    }
}

class Test
{
    static void Main()
    {
        Console.WriteLine("First.b: {0}, Second.b: {1}",
                          First.b, Second.b);
    }
}

初期化の順序は、変数が宣言されるテキストの順序であると仕様で定義されていますが、2つの変数が部分的なクラスに寄与する異なるファイルにある場合、初期化の順序は未定義になります。

Mehrdadの答えは、もう1つの良い答えです。物理的なレイアウトが重要な場合は、宣言の順序によって影響を受ける可能性が非常に高くなります。

于 2009-01-10T16:13:28.733 に答える
1

フィールドが宣言の一部として初期化される場合、フィールドはファイルに表示される順序でコンストラクター(インスタンスまたは静的)に追加されます。

于 2009-01-10T16:14:17.033 に答える
0

XmlSerializerは、ソースファイルに表示される順序でメンバーをシリアル化すると思います。

于 2009-01-10T17:34:25.420 に答える
0

リフレクションを介して読み取ることができるクラスのメタデータとして、フィールドの順序を使用 (悪用?) できます。

たとえば、フィールド ID、PORT、および XOR をこの順序で持つネットワーク プロトコルを表すクラスがある場合、次のように定義できます。

class MyProtocol {
    int ID;
    int PORT;
    int XOR;
}

ここで、リフレクションを使用してプロトコルのフィールドを反復処理し、ネットワーク経由で送信するとします。GetProperties によって返される順序は定義したとおりであり、追加のメタデータを明示的に記述する必要はありません。

これに依存するのが良い考えかどうかはわかりません。

于 2009-01-10T16:55:07.993 に答える