SAFE指向C#中指针(对引用的引用)的指针

在我正在处理的C#应用​​程序中,我有一个很长的标识符如下: –

foo.bar.bwah.blah.whatever.very.very.huge 

每当我引用这个对象时,这绝对是一场噩梦,不幸的是我确实需要引用它:

 var something = foo.bar.bwah.blah.whatever.very.very.huge.a; var somethingElse = foo.bar.bwah.blah.whatever.very.very.huge.b; foo.bar.bwah.blah.whatever.very.very.huge.c = 12; 

等等

我想使用更小的某种别名更新此代码,但问题是我想更改底层引用,并且在没有显式更新别名的情况下也使用别名更新。

目前,如果我做以下事项: –

 foo.bar.bwah.blah.whatever.very.very.huge.a = "hello"; string shorter = foo.bar.bwah.blah.whatever.very.very.huge.a; foo.bar.bwah.blah.whatever.very.very.huge.a = "world"; Console.WriteLine(shorter); 

它会输出“你好”。 我想要达到的目标如下: –

 foo.bar.bwah.blah.whatever.very.very.huge.a = "hello"; string** shorterPointer = &foo.bar.bwah.blah.whatever.very.very.huge.a; foo.bar.bwah.blah.whatever.very.very.huge.a = "world"; Console.WriteLine(**shorter); 

哪个会根据需要输出“世界”。

我相信你可以使用C#中的不安全代码来实现这样的function,但是我不能这样做,我只能使用安全代码。

有没有人有任何想法我怎么可能实现这一点?

请注意:这个问题不是关于字符串是不可变的,我知道它们是 – 事实上我认为它们是出于问题的目的。 如果我使用其他类型的话可能更简单…所以当我将“hello”分配给a“then”时,我每次都会实例化不同的对象 ,因此我存储的对a的引用在重新生成后变为无效分配。

一种方法是使用一个或一对lambda。

例如:

 Func getter = () => blah_de_blah; Action setter = x => blah_de_blah = x; 

现在,您可以使用getter和setter来读取和写入长标识符。

但是,由于您的点是成员访问器,因此最简单的方法是引用直接父级,如下所示:

 var myHuge = foo.bar.bwah.blah.whatever.very.very.huge; // now access myHuge.a everywhere 

这在任何情况下都是很好的做法,因为像这样的长点缀表达式违反了Demeter法则 ,这会抑制代码库的灵活性 – 它在太多地方需要太多信息。

我会使用命名空间别名。

 using myAlias = foo.bar.bwah.blah.whatever.very.very 

然后在你的方法里面你只需输入: myAlias.huge.a = "hello";

第一件事。 我会重新考虑你的架构。 这似乎太复杂了! 🙂

无论如何,让我们开展业务。

字符串在.NET中是不可变的 ,这是你的问题。 更改对象的属性时,您将在内存上创建一个新字符串,并使用该对象的属性指向该字符串。 但是,这不会改变你的字符串变量(为什么要这样?)。 变量没有改变,因此它一直指向前一个字符串。

这就是问题,现在解决方案。 我建议创建一个对包含字符串的对象的引用,只是上面的一个级别,如下所示:foo.bar.bwah.blah.whatever.very.very.huge.a =“hello”; 巨大的= foo.bar.bwah.blah.whatever.very.very.huge; huge.a =“foo!”;

希望能帮助到你! 🙂