在我投射之后,我无法设置属性的值.我不确定这是否被称为拳击.
无论如何,新的变量正在设置,但原始的不是.我认为新变量只是对原始变量的引用.但是当我检查intellisence/debug观察器时,原始属性仍为null.
这是代码.
// NOTE: data is either a Foo || FooFoo || FooBar, at this point. // only Foo impliments ITagElement. if (data is ITagElement) { var tags = ((ITagElement)data).TagList; // At this point, tags == null and data.TagList == null. if (tags.IsNullOrEmpty()) { tags = new List(); } tags.Add(new Tag { K = xmlReader.GetAttribute("k"), V = xmlReader.GetAttribute("v") }); // At this point, Tags.Count == 1 and data.TagList == null :( :( :( }
请注意有关该值我行内注释tags
和data.TagList
?有人可以解释一下我做错了什么吗?我认为变量tags
只是属性的引用指针data.TagList
..但它看起来不是.
谢谢你们的答案!这是令人尴尬的原因我多年来一直在做这些事情,但仍然忘记/没有注意到这样的简单事情.(当然,现在让我看到了光明).
Marc得到了积分,因为他的答案(IMO)对我的单个金发脑细胞来说是最简单的.
谢谢大家!
标签和数据是完全孤立的变量.仅仅因为你指定了一个对象tags
,这对变量 没有任何影响data
.
您感到困惑的是,当两个变量指向同一个对象时,将通过任一变量看到对(单个)对象的更改.
基本上,如果data
启动非null,则有
数据:指向"列表A"
标签:指向"列表A"
在这种情况下,将对象添加到任一对象data
或tags
实际上是将对象添加到相同的"列表A"
但是,如果data
启动为null,则您具有:
data:指向null
tags:指向null
然后你分配tags
,给予:
data:指向null
标签:指向"列表B"
您必须手动分配"列表B" data
才能使其坚持下去.
但是,有一种方法可以使它(分配接口/对象)工作:ref
和泛型:
using System.Collections.Generic; using System; class Foo : IBar { Listlist = new List (); public int Count { get { return list.Count; } } void IBar.Add(string s) { list.Add(s); } } interface IBar { void Add(string s); } static class Program { static void Main() { Foo foo = null; // note foo starts as null CreateAndAdd(ref foo, "abc"); Console.WriteLine(foo.Count); // prove non-null and added } static void CreateAndAdd (ref T data, string s) where T : IBar, new() { if (data == null) { data = new T(); } // create data.Add(s); // mutate } }