C# C中指向指针(井引用到引用)的安全指针#

C# C中指向指针(井引用到引用)的安全指针#,c#,.net,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.bw

在我正在处理的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);
它将输出“hello”。我想要达到的目标如下:-

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,然后将“world”分配给a时,每次我都会实例化不同的对象,因此我存储的对a的引用在重新分配后变得无效。

一种解决方法是使用一个或一对lambda

例如:

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

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

首先。我会重新考虑你的建筑。这似乎太复杂了!:)

不管怎样,让我们谈正事吧

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

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


希望有帮助!:)

我会使用名称空间别名

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

然后在方法中只需键入:
myAlias.ground.a=“hello”

这太好了,巴里,你绝对是个救命恩人!如果是这样的话,那么你所需要做的就是保留一个对巨量的引用,并且每次都取消引用以获得“a”成员。巴里,如果我然后重新分配bar呢?那就不行了。这是关于德米特定律的一个很好的观点,谢谢,我来看看建筑!如果你重新分配到酒吧,那么你会打破它,是的。然而,这也将打破lambda方法——最多,lambda将捕获表达式的根(如果有的话,则隐式表示“this”,否则表示“foo”)。重新指定foo的“bar”属性将以同样的方式破坏引用。首先,这与字符串无关,我在假设字符串是不可变的情况下使用了该示例,以便更清楚地说明我的观点!这也许不是最好的选择!:-)是的,但是如果我想重新分配“巨大”对象呢?如果说bwah被重新分配,我们也会出错。哦,我不认为这是架构问题!虽然也许它可以建造得更好;实际代码只有3-4个字段深,只有名称相当长。我认为这个问题很有可能在一个结构良好的架构中出现。我看到了克洛诺斯,这是真的。现在我明白你的意思了。然而,我认为仅仅为了写更短的名字就把代码复杂化太多是不值得的。但也许只是我!不管怎么说,这个问题很有趣,我会关注它,如果我有什么想法,我会再发一次!using语句不只是用于类型别名吗?您只能使用using定义名称空间。由于出现的问题是一长行代码,我想这会起作用;)