16

値型に対してこのようなことが可能になる方法はないかと思います...

public static class ExtensionMethods {
    public static void SetTo(this Boolean source, params Boolean[] bools) {
        for (int i = 0; i < bools.Length; i++) {
            bools[i] = source;
        }
    }
}

その後、これが可能になります:

Boolean a = true, b, c = true, d = true, e;
b.SetTo(a, c, d, e);

もちろん、boolは値型であり、参照としてではなく値として関数に渡されるため、これは機能しません。

(別のクラスを作成することによって)値型を参照型にラップする以外に、params修飾子を使用しながら参照(ref)によって変数を関数に渡す方法はありますか?

4

5 に答える 5

23

これは不可能です。理由を説明するために、最初に、値型のローカル変数の割り当て解除をスタックに配置することによって最適化する理由についての私のエッセイを読んでください。

https://web.archive.org/web/20100224071314/http://blogs.msdn.com/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two。 aspx

これで、「refbool」を配列に格納できない理由が明らかになるはずです。可能であれば、参照されているスタック変数よりも長く存続する配列を作成できます。私たちには2つの選択肢があります:これを許可するか、間違った場合にクラッシュして恐ろしく死ぬプログラムを作成する-これはCの設計者によって行われた選択です。または、それを許可せず、柔軟性は低いがより多くのシステムを使用する安全な。後者を選びました。

しかし、これについてもう少し深く考えてみましょう。「変数を設定できるもの」を渡すことが必要な場合は、それがあります。それは単なる代理人です:

static void DoStuff<T>(this T thing, params Action<T>[] actions)
{
    foreach(var action in actions) action(thing);
}
...
bool b = whatever;
b.DoStuff(x=>{q = x;}, x=>{r = x;} );

わかる?

于 2009-11-21T18:43:25.997 に答える
3

残念ながら、Java のコミュニティ、そして現在は .NET の開発者は、「安全性」の名の下に柔軟性を低くすることが望ましい解決策であると判断しました。より少ないコード行で同じ結果を達成するには、非常に複雑なものを選択する必要があります (これらすべてのクラス)。構造、デリゲートなど)。

Delphi では、単純に次のようなことができます。

var
  a: integer; f: double; n: integer;
sscanf(fmtstr, valuestr, [@a, @f, @n]);

//<-- "sscanf" は、ポインターのオープン配列を取る、私が自分で書いた関数です。

C# では、次のことを行う必要があります。

int a; double f; int n;
object [] o = new object[];
sscanf(fmtstr, valuestr, ref o);
a = o[0];
f = o[1];
n = o[2];

これは、1 行の Delphi コードで実行できることを 5 行のコードで実行できます。コードのバグの可能性がコードの行数に応じて幾何学的に増加するという式がどこかにあると思います。したがって、コードが 20 行ある場合、コードにバグがある可能性は、10 行ある場合の 4 倍になります。

もちろん、これらすべての奇妙な山括弧と奇妙な構文でデリゲートを使用することでコードの # 行を減らすことができますが、それはバグの天国でもあると思います。

于 2012-12-10T15:28:35.943 に答える
0

bools が参照型であっても、これは不可能です。aclassは参照型ですが、の変数Boolean[]は依然として値です。参照であるだけです。参照の値を割り当てると、その特定の変数の値が変更されるだけです。変数の配列という概念はref意味がありません (配列はその性質上、一連の値であるため)。

于 2009-11-21T17:04:22.513 に答える