代码之家  ›  专栏  ›  技术社区  ›  ljs TheVillageIdiot

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

  •  2
  • ljs TheVillageIdiot  · 技术社区  · 16 年前

    在我正在开发的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中的不安全代码可以实现类似的效果,但是我 不能 这样做,我只需要使用安全代码。

    有人知道我怎样才能做到这一点吗?

    请注意: 这个问题不是关于字符串是不可变的,我知道它们是-事实上,我假设它们是为了这个问题的目的。如果我用其他类型的…所以当我把“你好”分配给当时的“世界”时,我是 实例化不同的对象 因此,每次重新分配后,我对a的存储引用都会失效。

    3 回复  |  直到 16 年前
        1
  •  5
  •   Barry Kelly    16 年前

    一种方法是使用一只或一对羊羔。

    例如:

    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 这抑制了代码库的灵活性——它在太多的地方需要太多的信息。

        2
  •  1
  •   Sergio    16 年前

    我将使用名称空间别名。

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

    然后在方法内部,您只需键入: myAlias.huge.a = "hello";

        3
  •  0
  •   rgargente Chelsea Urquhart    16 年前

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

    不管怎样,我们开始谈正事吧。

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

    这就是问题所在,现在就来解决。我建议创建对包含字符串的对象的引用,仅高于一个级别,如下所示: foo.bar.bwah.blah.whatever.very.very.hurge.a=“你好”; 巨大的=foo.bar.bwah.blah.whatever.very.very.large; 巨大的。A =“嘘!”;

    希望它有帮助!:)