设置变量引用的完整性检查?

时间:2016-06-15 22:33:47

标签: c# reference

在我的应用程序中,我的主要表单是单例类MainForm.Instance。它有一个属性,有一个属性等。为了防止我的手指在我正在处理的类中键入它我已经设置了属性的本地引用。

MyClass myClassInst = MainForm.Instance.MyProperty.AProperty.TheProperty;

通过本地参考,我完成了所有工作

myClassInst.AnInt = 4;
myClassInst.AThing = newValue;
// ... etc

假设我现在已经创建了MyClass的新实例,并希望将MainForm.Instance....设置为等于它。 我是否需要重置对新对象的本地引用?

MyClass newClassInst = new MyClass();
MainForm.Instance.MyProperty.AProperty.TheProperty = newClassInst;

// Do I need to do this?
myClassInst = newClassInst;

// What about this?
myClassInst = MainForm.Instance.MyProperty.AProperty.TheProperty;

另外,在引用我所说的"我的本地参考"?

时,我是否使用了正确的词汇表?

现在我"知道"我不需要这样做,但我已经彻底迷惑了自己。 myClassInst应该指向包含MyClass对象的内存位置,无论对象本身是否发生更改myClassInst应始终引用它,只要它存在,是否正确?

编辑:我想我刚刚找到了一个更有说服力的方法来解决上面提到的问题。如上所述,我有一些本地参考

MyClass myClassInst = MainForm.Instance.MyProperty.AProperty.TheProperty;

但这实际上是作为我的应用程序中的属性实现的

private MyClass MyClassInst { get; set; } = ...;

而不是担心何时重置" myClassInst指向新引用我可以修改属性以返回或修改MainForm.Instance...的当前引用

private MyClass MyClassInst
{
    get { return MainForm.Instance.MyProperty.AProperty.TheProperty; }
    set { MainForm.Instance.MyProperty.AProperty.TheProperty = value; }
}

此属性将返回当前引用的任何TheProperty,并且inturn将指定当前引用TheProperty点。

这让我想起using别名的类名......

using ShortName = ANameSpace.BNameSpace.AReallyRidiculouslyLongClassName;

2 个答案:

答案 0 :(得分:2)

myClassInstTheProperty保持相同的引用,即它们都指向同一个对象。

myClassInst -------------> Object
                             ^
                             |
TheProperty -----------------+           

如果您将新对象分配给TheProperty,则myClassInst仍会引用旧对象。为什么要指向新对象?

myClassInst -------------> Object

TheProperty -------------> new object

注意:myClassInstTheProperty都不是对象。它们是对象的引用,如指向某个东西的箭头。

但您可以参考AProperty

MyAClass aProp = MainForm.Instance.MyProperty.AProperty;
aProp.TheProperty.AnInt = 4;
MyClass newClassInst = new MyClass{ AnInt = 5 };
MainForm.Instance.MyProperty.AProperty.TheProperty = newClassInst;

// Now, since AProperty didn't change, you can reference the new object
Console.WriteLine(aProp.TheProperty.AnInt); // Prints 5

答案 1 :(得分:1)

是的,你需要做这两件事中的一件。

您的myClassInst实例参考副本。创建新实例时,需要更新所有引用以指向新实例。

您最初复制的引用的更新不会传播到该引用的副本。