在我正在处理的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#中的不安全代码来实现这样的功能,但是我不能这样做,我只能使用安全代码.
有没有人有任何想法我怎么可能实现这一目标?
请注意:这个问题不是关于字符串是不可变的,我知道它们是 - 事实上我认为它们是出于问题的目的.如果我使用其他类型的话可能更简单...所以当我将"hello"分配给a"then"时,我会在每次场合实例化不同的对象,因此我存储的对a的引用在重新生成后变为无效分配.
一种方法是使用一个或一对lambda.
例如:
Funcgetter = () => 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法则,这会抑制代码库的灵活性 - 它在太多地方需要太多信息.