5

これが私のクラスです:

public class UserInformation
    {
        public string Username { get; set; }
        public string ComputerName { get; set; }
        public string Workgroup { get; set; }

        public string OperatingSystem { get; set; }
        public string Processor { get; set; }
        public string RAM { get; set; }
        public string IPAddress { get; set; }

        public UserInformation GetUserInformation()
        {
            var CompleteInformation = new UserInformation();

            GetPersonalDetails(ref CompleteInformation);
            GetMachineDetails(ref CompleteInformation);

            return CompleteInformation;
        }

        private void GetPersonalDetails(ref UserInformation CompleteInformation)
        {

        }

        private void GetMachineDetails(ref UserInformation CompleteInformation)
        {

        }
    }

ref キーワードは、コンピューターに同じ変数を使用し、新しい変数を作成しないように指示するという印象を受けています。

私はそれを正しく使用していますか?呼び出しコード行と実際のメソッド実装の両方で ref を使用する必要がありますか?

4

4 に答える 4

5

参照型(あなたの場合、UserInformationクラスは参照型です)をパラメータとして渡すと、デフォルトではクラスへのポインタをで渡します。つまり、同じGetPersonalDetailsを指すポインタの独自のコピーを取得しますクラスのインスタンス。UserInformation

ref例でキーワードを使用すると、UserInformationインスタンスへの同じポインターがメソッドに渡されます。

したがって、あなたの場合、意図が のプロパティを単純に変更することである場合、とから実際のインスタンスを変更するためUserInformationrefキーワードは必要ありません。ただし、これらのメソッド内から新しいオブジェクトをインスタンス化する、またはインスタンスを null に設定することが意図されている場合は、キーワードを使用する必要があります。GetPersonalDetailsGetMachineDetailsUserInformationref

この記事では、 Jon Skeetがパラメーターの受け渡しについて素晴らしい説明をしています。

于 2010-04-25T14:37:45.803 に答える
4

おそらくここで使用する必要はありませんref。クラスは参照型なので、すでに参照を渡しています。

これはあなたのコードでref、他の多くのスタイルの問題が修正されています:

    public UserInformation GetUserInformation()
    {
        UserInformation userInformation = new UserInformation();

        updatePersonalDetails(userInformation);
        updateMachineDetails(userInformation);

        return userInformation;
    }

    private void updatePersonalDetails(UserInformation userInformation)
    {
        userInformation.FirstName = "Sergio";
        userInformation.LastName = "Tapia";
     }

    private void updateMachineDetails(UserInformation userInformation)
    {
        userInformation.MachineName = "Foobar";
    }
于 2010-04-25T14:29:14.070 に答える
3

ref キーワードは、コンピューターに同じ変数を使用し、新しい変数を作成しないように指示するという印象を受けています。

多分あなたはCのバックグラウンドを持っています。C クラス/構造体とは異なり、C# クラスは呼び出された関数にクラス全体のコピーを作成しません。C# で struct を使用する場合、構造体の内容全体の独立したコピーが呼び出された関数に作成されるため、構造体データ構造を関数に渡すときにメモリ/ランタイム オーバーヘッドを最小限に抑えたい場合は、ref が保証されます。

C の知識がある場合、上記のコードは次のように変換されます。

UserInformation *CompleteInformation = new UserInformation();

GetPersonalDetails(&CompleteInformation);    

ref を持つ関数は次のように変換されます。

void GetPersonalDetails(UserInformation **CompleteInformation)
{
    // you can make the CompleteInformation outside to point to new instance
}

そのため、CompleteInformation を GetPersonalDetails 内の新しいインスタンスに向けない場合は、ref キーワードを使用する必要はありません。呼び出しステートメントと呼び出された関数の ref キーワードを削除します。

var CompleteInformation = new UserInformation();
GetMachineDetails(CompleteInformation);

private void GetPersonalDetails(UserInformation CompleteInformation)
{
    // you cannot make the CompleteInformation outside to point to new instance
}

その C# コードは次のように C に変換されます。

UserInformation *CompleteInformation = new UserInformation();

GetPersonalDetails(CompleteInformation);    

void GetPersonalDetails(UserInformation *CompleteInformation)
{
    // you cannot make the CompleteInformation outside to point to new instance
}

うーん.. :-)私の答えをC#の用語全体で説明する方法をまだ考えています.Cとの類似性はありません.

于 2010-04-25T14:48:04.530 に答える
0

C++ とは異なり、C# では、参照された変数を関数に渡すことは、同じ変数を使用することを意味します。つまり、変数を変更でき、この変更は呼び出し元に表示されます。ref キーワードを使用すると、参照自体を変更できます (つまり、参照は参照によって渡されます)。これは、関数が null への参照を設定するか、それを別のオブジェクトに割り当てる可能性があることを意味し、この変更は呼び出し元に表示されます。はい、ref は関数と呼び出し元の両方で使用する必要があります。これは C++ よりも優れています。呼び出し元のコードでわかるように、パラメーターは参照によって渡されます。

C/C++ を知っている場合、ref キーワードなしで参照型を関数に渡すことは、C++ の * と同じです。ref を使用して関数に参照型を渡すことは、C++ の ** と同じです。

于 2010-04-25T14:34:23.653 に答える