15

少し奇妙な質問ですが、誰かが助けてくれるのではないかと思っていました...

C ++では、このようなことができます

class MyOtherClass
{
     private:
         MyLogger* logger;
     public:
         MyOtherClass (MyLogger* logger)
              : logger (logger)
         {}
};

class MyClass
{
     private:
         MyLogger* logger;
     public:
         MyClass (MyLogger* logger)
              : logger (logger)
         {}
};

int main (int c, char** args)
{
    MyLogger* logger = new MyLogger ();
    /* Code to set up logger */
    MyOtherClass* myOtherClass = new MyOtherClass (logger);
    MyClass* myClass = new MyClass (logger);
}

他の各オブジェクト(myOtherClassとmyClass)にロガーへのポインターが含まれるように、同じロガークラスを呼び出します。しかし、C#で同じことをどのように達成しますか?グローバルオブジェクトへの参照またはポインタを格納する方法はありますか?C#で次のようなことをすると推測します

public class MyClass
{
     private MyLogger logger = null;

     public MyClass (MyLogger _logger)
     {
         logger = _logger;
     }
};

クラス変数loggerを_loggerのコピーに実際に割り当てているということですか?または私は物事を混ぜていますか:S

どんな助けでも大歓迎です、そして前もってありがとう!

4

4 に答える 4

20

実際、C#でははるかに簡単です。

基本的に、これを行うことができます:

MyLogger logger = new MyLogger();
MyOtherClass myOtherClass = new MyOtherClass(logger);
MyClass myClass = new MyClass(logger);

C#では、クラスは基本的に参照として保持されます(実際には内部のポインターにすぎません)。このスニペットでは、両方のオブジェクトのコンストラクターにへの参照を渡します。loggerその参照は同じであるため、各インスタンスには同じMyLoggerインスタンスがあります。

この特定の例では、ポインタ構文=Dを削除する必要があります。

于 2012-11-08T16:21:43.960 に答える
4

あなたは物事を混乱させています。C#では、次のような代入ステートメント

    logger = _logger;

オブジェクトではなく、参照をコピーします。このステートメントが実行された後も、(多くても)1つしかありません。これは、2つのオブジェクト変数によって参照されるようになりました。MyLogger

于 2012-11-08T16:22:12.740 に答える
2

タイプが参照型の場合(クラスの場合)、オブジェクト自体ではなく、参照をコピーします。

参照型とは対照的に、値型があります。値のタイプは基本的に基本的なタイプです:、、intなどdouble

あなたの場合、それは、クラスからアクセスするか、外部の呼び出しメソッドからアクセスするかにかかわらず、同じオブジェクトを操作することを意味します。これは、参照されているオブジェクトをターゲットにしているためです。

于 2012-11-08T16:21:19.047 に答える
0

将来の私のためにコメントを追加することも忘れてしまいます。また、c#を初めて使用する人にとっては、「c ++ポインター」と「c#オブジェクト参照」と「C#オブジェクト参照ByRef」を視覚化したいと考えています。Passing By Ref(最後のメソッド呼び出し)と新しいobjの割り当てによって、元のオブジェクトがどのように変更されるかに注目してください。

using System;

public class Emp
{
    public int TimeSpentInCompany {get; set;}
}

public class Program
{
    public static void Main()
    {
        
        Emp t1 = new Emp{TimeSpentInCompany = 5};
        Console.WriteLine("original obj before method call-->" + t1.TimeSpentInCompany);
        
        // Test is one by one
        
        // var res = PassObject_SimpleUpdateMemberAndPrint(t1);
        // var res = PassObject_SimpleUpdateObjectAndPrint(t1);
        // var res = PassObjectByRef_SimpleUpdateMemberAndPrint(ref t1);
        var res = PassObjectByRef_SimpleUpdateObjectAndPrint(ref t1);
        
        Console.WriteLine("original obj after method call-->" + t1.TimeSpentInCompany);
        Console.WriteLine("obj from method response-->" + res.TimeSpentInCompany);
    }
    
    static Emp PassObject_SimpleUpdateMemberAndPrint(Emp data)
    {
        /*
            original obj before method call-->5
            in method before modification obj member--> 5
            in method AFTER modification obj member--> 9
            original obj after method call-->9
            obj from method response-->9
        */      
        Console.WriteLine("in method before modification obj member--> "+ data.TimeSpentInCompany);
        data.TimeSpentInCompany += 4;
        Console.WriteLine("in method AFTER modification obj member--> "+ data.TimeSpentInCompany);
        return data;
    }   
    
    static Emp PassObject_SimpleUpdateObjectAndPrint(Emp data)
    {
        /*
            original obj before method call-->5
            in method before assigning new obj --> 5
            in method AFTER assigning new obj --> 9
            original obj after method call-->5
            obj from method response-->9
        */
        Console.WriteLine("in method before assigning new obj --> "+ data.TimeSpentInCompany);
        data = new Emp{TimeSpentInCompany = 9};
        Console.WriteLine("in method AFTER assigning new obj --> "+ data.TimeSpentInCompany);
        return data;
    }
    
    static Emp PassObjectByRef_SimpleUpdateMemberAndPrint(ref Emp data)
    {
        /*
            original obj before method call-->5
            in method before modification obj member--> 5
            in method AFTER modification obj member--> 9
            original obj after method call-->9
            obj from method response-->9
        */      
        Console.WriteLine("in method before modification obj member--> "+ data.TimeSpentInCompany);
        data.TimeSpentInCompany += 4;
        Console.WriteLine("in method AFTER modification obj member--> "+ data.TimeSpentInCompany);
        return data;
    }   
    
    static Emp PassObjectByRef_SimpleUpdateObjectAndPrint(ref Emp data)
    {
        /*
            original obj before method call-->5
            in method before assigning new obj --> 5
            in method AFTER assigning new obj --> 9
            original obj after method call-->9
            obj from method response-->9
        */
        Console.WriteLine("in method before assigning new obj --> "+ data.TimeSpentInCompany);
        data = new Emp{TimeSpentInCompany = 9};
        Console.WriteLine("in method AFTER assigning new obj --> "+ data.TimeSpentInCompany);
        return data;
    }
}
于 2020-07-18T13:05:43.137 に答える