6

Maybe it's a newbie question, but could anyone explain me how the tied/linked classes (I don't know their true names) are made? The example can be LINQ TO XML.

When I have the beneath code:

XDocument doc = XDocument.Load("...");
XElement element = doc.Element("root");
element.SetAttribute("NewAttribute", "BlahBlah");
doc.Save("...");

I change only element variable (I don't need to update it in doc because its referenced). How to create such classes?

[edit]
I tried @animaonline's code and it works

A a = new A();
B b = a.B(0);
b.Name = "asd";
Console.WriteLine(a.Bs[0].Name); // output "asd"

But tell what's the difference with the code above and below?

List<string> list = new List<string>();
list.Add("test1");
list.Add("test2");
var test = list.FirstOrDefault();
test = "asdasda";
Console.WriteLine(list[0]); // output "test1" - why not "asdasda" if the above example works???
4

3 に答える 3

4

doc.Element はメソッドであり、指定された XName を持つ最初 (ドキュメント順) の子要素への参照を返します。

次の例を検討してください。

public class A
{
    public A()
    {
        this.Bs = new List<B>();

        this.Bs.Add(new B { Name = "a", Value = "aaa" });
        this.Bs.Add(new B { Name = "b", Value = "bbb" });
        this.Bs.Add(new B { Name = "c", Value = "ccc" });
    }

    public List<B> Bs { get; set; }

    public B B(int index)
    {
        if (this.Bs != null && this.Bs[index] != null)
            return this.Bs[index];

        return null;
    }
}

public class B
{
    public string Name { get; set; }
    public string Value { get; set; }
}

使用法:

A a = new A();
var refToA = a.B(0);
refToA.Value = "Some New Value";

foreach (var bs in a.Bs)
    System.Console.WriteLine(bs.Value);

説明:

ご覧のとおり、B() メソッドは A クラスのリスト項目への参照を返します。これを更新すると、A.bs リストの値も変更されます。これはまったく同じオブジェクトであるためです。

于 2013-08-01T11:55:42.973 に答える
1

私はあなたが求めていることを理解していると思います。私の回答の妥当性は、完全にこの前提に基づいています。:D


クラス メンバーはプリミティブ型である必要はありません。他のクラスでもかまいません。

簡単な例

SimpleXDocument と SimpleXElement の 2 つのクラスがある場合、SimpleXDocument には SimpleXElement 型のメンバー/公開プロパティがあることに注意してください。

public Class SimpleXDocument
{
    private SimpleXElement _element;
    public SimpleXDocument(){ this._element = null;}
    public SimpleXDocument(SimpleXElement element){this._element = element;}
    public SimpleXElement Element
    {
        get{return this._element;}
        set{this._element = value;}
    }
}

Public Class SimpleXElement
{
    private String _value;
    public SimpleXElement(){this._value = String.Empty;}
    public SimpleXElement(String value){this._value = value;}
    public String Value
    {
        get{return this._value;}
        set{this._value = value;}
    }
}

SimpleXDocumentは、SimpleXElement 型の独自のメンバーを参照します。次のようなことができます。

SimpleXDocument doc = new SimpleXDocument();
doc.Element = new SimpleXElement("Test 1");
SimpleXElement element = new SimpleXElement();
element.Value = "Test 2";
doc = New SimpleXDocument(element);
SimpleXElement anotherElement = new SimpleXElement("another test");
doc.Element = anotherElement;
doc.Element.Value = "yet another test";
anotherElement.Value = "final test"; //N.B. this will update doc.Element.Value too!
于 2013-08-01T12:12:10.217 に答える
-2

私が理解しているように、要素への参照は必要ありませんが、参照の背後にあるオブジェクトのコピーが必要です。

この答えが役立つと思います: https://stackoverflow.com/a/129395/1360411

于 2013-08-01T12:22:06.673 に答える