在我正在处理的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”时,我每次都实例化不同的对象,因此我存储了引用在重新分配后变为无效。
答案 0 :(得分:5)
一种方法是使用一个或一对lambda。
例如:
Func<string> getter = () => blah_de_blah;
Action<string> setter = x => blah_de_blah = x;
现在,您可以使用getter和setter来读取和写入长标识符。
但是,由于您的点是成员访问者,因此最简单的方法是引用直接父级,如下所示:
var myHuge = foo.bar.bwah.blah.whatever.very.very.huge;
// now access myHuge.a everywhere
这在任何情况下都是很好的做法,因为这样的长点缀表达式违反了Law of Demeter,这会抑制代码库的灵活性 - 它在太多地方需要太多信息。
答案 1 :(得分:1)
我会使用命名空间别名。
using myAlias = foo.bar.bwah.blah.whatever.very.very
然后在您的方法中,您只需键入:myAlias.huge.a = "hello";
答案 2 :(得分:0)
第一件事。我会重新考虑你的架构。这似乎太复杂了! :)
无论如何,让我们开展业务。
字符串在.NET中是不可变的,这就是你的问题。更改对象的属性时,您将在内存上创建一个新字符串,并使用该对象的属性指向该字符串。但是,这不会改变你的字符串变量(为什么要这样?)。变量没有改变,所以它一直指向前一个字符串。
这就是问题,现在解决方案。我建议创建一个对包含字符串的对象的引用,只是上面的一个级别,如下所示: foo.bar.bwah.blah.whatever.very.very.huge.a =“你好”; 巨大的= foo.bar.bwah.blah.whatever.very.very.huge; huge.a =“foo!”;
希望它有所帮助! :)