12

データ型 var のサブクエリがいくつかあります。これらはデータテーブルで機能しています。これらを別のメソッドに渡したいのですが、どうすればよいですか? 元:

    var subquery1= from results in table.AsEnumerable()
               where //some condition
               select new
               {
                  column1=results.field1,
                  column2 = results.field2
                  etc.,
               }
     var subquery2= from results in table.AsEnumerable()
               where //different condition
               select new
               {
                  column1=results.field1,
                  column2 = results.field2
                  etc.,
               }

ここで、これらの subquery1、subquery2 を変数として渡すメソッドを定義したいと思います。元:

void updategrid(var queries)
          {
          //some logic
           }

メソッドを実行します。

updategrid(subquery1);
updategrid(subquery2);

メソッドを定義するときに var を使用しようとすると、気に入らない。その方法を教えてください。ありがとう。

4

7 に答える 7

31

結果は一連の匿名オブジェクトです。varキーワードは、コンパイラーに「ねえ、使用法から引数を推測してください」と言っているだけです。使用法から型を推測するプロセスは、Type Inferenceと呼ばれます。ただし、メソッド宣言でメソッド引数の型を推測するように C# コンパイラに指示することはできません。また、anonymous objectsお名前をご指定いただけない場合もございます。したがって、他のメソッドの内外でそれらを渡すべきではありません。それらをキャストしてからdynamicメンバーにアクセスすることができCallSiteます(コンパイラーは、のような動的オブジェクトのメンバーにアクセスするときにそれらを作成しますmyDynamic.Name)、または匿名オブジェクトをにキャストできますobjectリフレクションを介してそのプロパティにアクセスしますが、これらのメソッドはすべて C# の慣用句ではなく、匿名オブジェクトのポイントを実際に見逃しています。クエリで匿名オブジェクトを作成する代わりに

select new
{
  //members selection
}

カスタム タイプを作成する

public class Result
{
    //Members declaration
}

そして、次の例のようにクエリの結果としてインスタンス化します: (var代わりにキーワードを置き換えることができますIEnumerable<Result>- コンパイルされたコードは同じになります)

IEnumerable<Result> subquery1 = from results in table.AsEnumerable()
                                where //some condition
                                select new Result
                                {
                                     //fill members here
                                }

メソッドは次のようになります

void updategrid(IEnumerable<Result> queries)
{
    //some logic here with strongly typed sequence
}

updategrid次に、単純に likeを呼び出すとupdategrid(subquery1)、要素の静的に型付けされたシーケンスのすべての美しさが本体に含まれますupdategrid

于 2013-01-11T15:28:53.167 に答える
11
void updategrid(var queries)

有効な C# ではありません。

varはシンタックス シュガーです。変数には型がありますが、コンパイラが型を静的に決定できる場合は宣言する必要はありません。

パラメーターを使用すると、コンパイラーには型を判別するための十分な情報がありません。

var同様に、割り当てなしで変数を宣言することはできません。

var something;

subquery1の型とsubquery2のパラメータupdategridがすべて同じであることを確認する必要があります。

于 2013-01-11T15:29:25.197 に答える
10

Var はデータ型ではありません。「アプリをコンパイルするときに、これが実際にどのデータ型であるかを把握する」の略です。データ型が実際に何であるかを把握し、それをパラメーターに使用するか、任意のデータ型で機能する汎用関数を作成できます。

于 2013-01-11T15:28:39.070 に答える
8

var引数の型でメソッドを宣言できます。しかし、あなたはそう書くことができます:

static void updategrid(dynamic queries)
{
} 

varを意味take type from right-hand side and declare variable with this type from left-hand sideし、これはコンパイル時に処理されます。varご覧のとおり、メソッドとして引数タイプを使用しても意味がありません。

于 2013-01-11T15:32:19.570 に答える
5

Objectまたはを使用するdynamic

void updategrid(object queries)

void updategrid(dynamic queries)

var->式の右側によって決定される静的タイプ。パラメータ/リターンタイプとして使用できません

object->すべての.NETタイプの基本クラス。

dynamic->タイプは実行時に解決されます。したがって、コンパイル時のチェックは行われず、インテリセンスは使用できません。パフォーマンスコストもかかります。

于 2013-01-11T15:33:14.703 に答える
2

C#には、「var」タイプはありません。「var」は、コンパイラに「次に来るものを分析して型を見つける」ように指示する単なるキーワードです。これは、実行時ではなく、コンパイル中に行われます。

あなたが話す変数は、実際には、コンパイラがコンパイル中に自動的に生成する匿名型として入力されます。このような型は名前がないため、パラメータ型の宣言や戻り値の使用には使用できません。

このデータの明示的なクラスを作成するか、.Net4以降でTuple<>ジェネリック型を使用する必要があります。

于 2013-01-11T15:30:41.557 に答える
0

おそらく動的参照を使用できますが、私はそうしません。

代わりに、これらのデータ型の実際のクラスを作成し、代わりにメソッドに渡すことをお勧めします。

例えば:

public class MyColumns
{
   public string column1 {get;set;}
   public string column1 {get;set;}
   //etc.
}

次のように作成できます。

var subquery1= from results in table.AsEnumerable()
               where //some condition
               select new MyColumns
               {
                  column1=results.field1,
                  column2 = results.field2
                  //etc.
               };

次のような関数があります。

public void updategrid(IEnumerable<MyColumns> queries)
{
}
于 2013-01-11T15:29:23.217 に答える