Мән өрісіне сілтеме жасау әдісі

C # -те басқа жолаққа сілтеме жасайтын өріс құрудың тәсілі бар ма?

class myClass
{
    bool b1;

    public void method1(ref bool b)
    {
        b1 = b;
    }
}

B1 мәнін b дәлелдеуге, b сияқты бастапқы дәлелдің мәніне сілтеме жасағанын қалаймын, сондықтан b1 ішіндегі өзгертулер түпнұсқа дәлелге әсер етеді.

EDIT:

Маған жетуге тырысатын нәрсе - өрісті автоматты түрде жаңартатын myCheckBox класы. Қараңыз: Мәнді қалай өзгертуге болады оқиға өңдегіші ішіндегі дәлелдер?

2
Көрсеткіштер бойынша оқыңыз. Және бұл: Блогтар .msdn.com/b/ericlippert/archive/2011/06/23/& hellip;
қосылды автор Hans Passant, көзі

4 жауаптар

Әрине! Эрикнің осы сұраққа берген жауабын қараңыз:

Мүше өрісіне ref параметрін орнату C#

Өзгелер көрсеткендей, айнымалыға сілтеме сақтай алмайсыз   C # өрісінде немесе шын мәнінде кез келген CLR тілінде.

     

Әрине сіз сыныптың данасына сілтеме жасай аласыз   айнымалы жеткілікті оңай

бар
3
қосылды

Делегаттар/оқиғалар арқылы жақсы шешілетін нәрсеге ұқсайды.

Мүмкін емес (күштік мән түрлері сілтеме түрлерінде әрекет ету үшін) жасауға тырысудың орнына, оқиға қолданылсын және бұл мән өзгергенде оны өртеп жіберіңіз.

Шақырушыдан/оқиғалардан осы оқиғаны жазыңыз және сіз баруға дайынсыз.

2
қосылды

Жақсы ... әрине, әртүрлі тәсілдер бар. Яғни рефлексияны қолданыңыз! Сіз өрістің мекен-жайын ала алмайсыз, бірақ біз рефлексияны пайдалана аламыз.

Рефлексия тікелей өріске енуден баяу, сізді ескертемін. Шын мәнінде, басқа класстардың жекеменшік салаларына кіру өте жаман іс-шара болып табылады! Кейде басқа адамдар жазған кодты бақылаусыз болған кезде кейбір лас қоқыстарға пайдалы.

Міне мысал, бірақ мен айтайын, бұл жақсы тәжірибе емес, мұнда қызығушылық пен білім алу үшін ғана!

Өрістерге қол жеткізудің басқа әдістерін, сипаттарды пайдаланып, немесе қасиеттеріңізді өзгертетін сыныпты пайдалану.

// Our FieldReference class that internally uses reflection to get or set a field value.
public class FieldReference
{
    private object ownerObject;
    private FieldInfo fieldInfo;

    public FieldReference(object ownerObject, string fieldName)
    {
        this.ownerObject = ownerObject;
        this.fieldInfo = ownerObject.GetType().GetField(fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    }

    public FieldReference(object ownerObject, FieldInfo fieldInfo)
    {
        this.ownerObject = ownerObject;
        this.fieldInfo = fieldInfo;
    }

    public T Value
    {
        get { return (T)this.fieldInfo.GetValue(this.ownerObject); }
        set { this.fieldInfo.SetValue(this.ownerObject, value); }
    }
}

// Our dummy class
public class MyClass
{
   //Our field we want to expose.
    private int myField;

    public MyClass(int value)
    {
        this.myField = value;
    }

   //Just a function we use to print the content of myField.
    public override string ToString()
    {
        return this.myField.ToString();
    }
}

class Program
{
    public static void Main()
    {
       //We create our class.
        MyClass mc = new MyClass(5);

       //We print field value, should be 5 :)
        Console.WriteLine(mc.ToString());

       //We create our field reference
        FieldReference fieldref = new FieldReference(mc, "myField");

       //We set the value using field reference.
       //Note, we accessed a private field :)
        fieldref.Value = 100;

       //Now we print the value, should be 100!
        Console.WriteLine(mc.ToString());

        Console.ReadLine();
    }
}
2
қосылды

мүмкін сіз үшін бұл не қажет болатынын білмейсіз, бұл үшін делегат пайдаланыңыз, бірақ ол код иісіне ұқсас:

class myClass
{
    Action modify;

    public void method1(Action modify)
    {
        this.modify = modify;
    }

    public void ModifyIt()
    {
        modify(false);
    }
}


bool b1 = true; //b1 is true
var m = new myClass();
m.method1(val => { b1 = val; });
m.ModifyIt(); //b1 is false now
1
қосылды