-2

以下について明確にする必要があります。

is/as 演算子

out/ref パラメーター修飾子

タイプ

気が進まない場合は、質問全体ではなく、知っていることや返信したいことだけに返信してください。

はい、これらについて説明を求めています。私を訂正するか、私がすでに言ったことに追加してください。

さて、私は少しググって、さまざまなサイト、MSDN などにたどり着きました。コンセプト全体を明確にするのに役立つコードを書き、最終的にそれを最大限に活用できるようにしてくれる人が必要です。これが他の人にも役立つことを願っています。

基本的にこれは私が理解したことです:

A)

疑似コードで

オブジェクトがこのタイプの場合は true、そうでない場合は false

簡単。それとも私はここで何か間違ったことをしていますか?

一部のタイプに制限や問題はありますか?

このコードは問題なく動作するので、これでうまくいったと思います。

object s = new SqlBoolean();
        if (s is SqlBoolean)
        {
            Console.WriteLine("Is SqlBoolean");
            Console.ReadLine();
        }

2)として

まあ、私はまだこれを完全に理解する必要があります。

MSDN レポート:

as 演算子は、互換性のある型間の変換を実行するために使用されます。as 演算子は、例外を発生させる代わりに、変換の失敗時に null を生成することを除いて、キャストに似ています。

さて、私はオブジェクト配列でループを試しましたが、基本的にはプリミティブのみを変換し、多くの問題を抱えています(少し難しいキャスティングごとにnullまたは何かがスローされます)

いえ

using System;
using System.Data.SqlTypes;

class StackOverflow
{
    public static void Main()
    {
        string country = "jii";
        string vatNum= "dde";

        object[] MyObjects = {country,
                              vatNum
                             };

        for (int i = 0; i<=MyObjects.Length-1;i++)
        {
            MyObjects[i] = MyObjects[i] as SqlString?;
            Console.WriteLine(MyObjects[i].ToString() + " " + MyObjects[i].GetType());
            Console.ReadLine();
        }
    }
} 

私が作成しているプログラムでは、これらの値を SqlStrings や SqlBooleans などに変換する必要があります。

「SqlString?」という行で SqlString を Nullable に強制していることに注意してください。最後に疑問符を付けます (? 強制的に nullable にする、誰がそれを知っていた!:D)。

基本的に、例外を使用せずに低レベルの変換を行うのに役立ちますか? または何?

3) refout

基本的に ref は、事前に宣言された変数の値を関数内から変更します。

IE

using System;

class StackOverflow
{
    public static void Main()
    {
        int x = 10;
        Write(func(ref x).ToString());
        Write(Convert.ToString(x));
    }

    public static int func(ref int y)
    {
        y += 10;
        return y;
    }

    public static void Write(string z)
    {

        Console.WriteLine(z);
        Console.ReadLine();

    }
} 

これを実行しても問題はなく、出力は 20 20 になり、両方の参照を削除すると 20 10 が出力されます

(ref は、メソッド内でインスタンスを作成せずに、外部で宣言された x を直接変更します)

アウトはどうですか?使用は何ですか????

わかりません。どこかを読むと、refと同じことを行うパラメーターのように見えますが、何らかの出力パラメーターを持つことができます。

前に示したコードで ref の代わりに出力すると、IntelliSense によってのみコンパイル エラーが発生し、それらの出力パラメーターを表示する方法さえわかりません。

私がやっているプロジェクトでは、次のコードを使用しています。

public static Array check(string country, string vatNum)
{
    bool valid;
    string name;
    string address;
    checkVatService vatchecker = new checkVatService();
    vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address);

    return new object[] {country,
                         vatNum,
                         valid,
                         name,
                         address
                         };
}

さて、checkVat は ヨーロッパのオンライン チェック Web サービスのコードです。

パラメーターがあり、webservice Web サイトのライブラリを使用する wsdl webservice によって生成されていることがわかります (必要に応じてライブラリへのリンク) 。

out パラメーターを使用するにはどうすればよいですか? return を使用せずに何らかの出力を行うためのものですか? それらをどのように使用しますか?とても詳しくお願いします

4)タイプ

これは、渡した Type の System.Type から型を返します。

最初に、渡したオブジェクトのタイプを次のように取得できると思いました

int x;
SqlBoolean xy = new SqlBoolean();
typeof(x) // integer
typeof(xy) // SqlBoolean

しかし、そうではありません。

System.Type から型を返すだけです。

お気に入り

typeof(int).ToString() // System.Int32 またはそのようなもの typeof(xy).ToString() // System.Data.SqlTypes.SqlSqlBoolean

そして、私はそれをどうするか本当に知りません。

オブジェクトのタイプを取得するには、オブジェクトなどから .GetType のようなことをしなければなりません。

では、typeof の実用的な用途と、それについて何が欠けているのでしょうか?

ありがとう

4

5 に答える 5

1

typeofGetTypeすべて異なり、異なる結果を出力できます。私が見た中で最も簡単な説明があるので、このSO投稿を参照してください。


ref と out

デフォルトでは、メソッドの引数は値で渡されます。これは、メソッドに渡されるときに引数の値がコピーされることを意味します。がある場合foo(int y){y = 9;} main(){int x = 5; Foo(x);}、メソッド Foo は x の値を y にコピーしてから、別の値を ya に割り当てます。x は 5 のままです。 などの参照型の引数がある場合Foo(object y){y = null;} main(){object x = new object(); Foo(x);}、y には x のコピーされた値が含まれます。これは参照値であり、オブジェクト自体ではありません。したがって、y に加えられた変更も x には反映されません。対照的に、ref と out は参照によって渡されます

// Example of ref:
// p DOES NOT copy x's reference value of the object
// p is x (or refer to the same memory as x)

class Ref_Example
{
   static void Foo(ref int p) { p = 8};
   static void Main() { 
      int x = 5; Foo(ref x);
      Console.WriteLine(x);    // output: 8 
   }
}

// Example of out:
// out = ref, except variables need not be assigned before method is called
// You use out when you have to return multiple values from a function  
Class Out_Example
{
   static void Find_Synonyms(
          string vocab, out string synonymA, out string synonymB)
   { // Lookup the synonyms of the word "rich" };

   static void Main()
   {
      string a, b;
      Find_Synonyms("rich", a, b);
      Console.WriteLine(a);   // abundant
      Console.WriteLine(b);   // affluent
}

もちろん、ref/out の設計目的を破り、変数に初期値を割り当てることで out の代わりに ref を使用できますが、論理的な意味がなく、コード リーダーを混乱させる可能性があります。(つまり、類義語を検索する前に、どのようにして類義語を知ることができるでしょうか? また、なぜ誤った初期値を割り当てたのでしょうか? など)。



さらに注意:

int =System.Int32およびSqlBoolean = System.Data.SqlTypes.SqlBoolean. int はおそらく伝統による単なるエイリアスSystem.Int32ですが、 は C# 型の完全な表現/名前です。、またはint xのようなメソッドに公開するものは何ですか? System.Int32。C# では、型は、データ型または参照型を定義するメンバーを持つクラス (System.Int32 など) です。x.Equalsx.ToStringx.Parse

于 2013-07-18T02:21:27.577 に答える