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

时间:2008-11-26 11:46:09

标签: c# .net

在我正在处理的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”时,我每次都实例化不同的对象,因此我存储了引用在重新分配后变为无效。

3 个答案:

答案 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!”;

希望它有所帮助! :)