【问题标题】:How do I reference a specific instance in c#?如何在 c# 中引用特定实例?
【发布时间】:2021-08-14 19:59:27
【问题描述】:

对象引用在 c# 中是如何工作的 - 我试过这个,我目前正在尝试让一个对象引用另一个对象实例。

我正在构建的课程中需要这个

    public class TransactionalProducer 
    {
        private readonly IMessageBusProducer producer;

        public TransactionalProducer (IMessageBusProducer bus, bool hasTransactionInitialized)
        {
            producer = bus;
            if(hasTransactionInitialized)
            {
                producer.InitTransactions();
            }
            producer.BeginTransaction();
        }
  }

看起来当我创建一个新的TransactionalProducer 时,producer 实例将被设置为一个新实例,其中值取自函数参数bus,而不是引用通过解析的那个构造函数。

如何确保当通过构造函数 public TransactionalProducer (IMessageBusProducer bus, bool hasTransactionInitialized) 实例化新的 TransactionalProducer 对象时,producer 设置为对 bus 的对象引用,而不是使用与函数参数bus相同的参数

【问题讨论】:

  • a,b,c 不是参考。它们是保存引用的变量。通过说 c = b,您将参考值从 b 复制到 c。但是随后您使用另一个字符串覆盖 b。
  • 查看我对这个问题的回答stackoverflow.com/questions/65418824/…。你的三个文字字符串是objects。您的变量包含对这些对象的引用。当您在两个引用类型的变量之间进行赋值时,右侧变量所持有的引用被分配给左侧的变量。当你说c=b 时,c 最终指向的是同一个对象 b。当您重新分配 b 时,c 不在乎。将引用类型变量视为其值是引用的值类型变量。
  • 另外,忽略字符串是不可变的(它们是)这一事实,像你正在做的赋值不会改变右手变量所指的对象。在c=b 的末尾,没有更改任何对象。只有变量只有左侧发生变化(引用的副本存储在右侧的变量被复制过来)
  • 所以c#不可能这样做? @Flydog57
  • “这样做”什么?您可以通过引用将引用作为参数传递给函数(请参阅我对上面提到的问题的回答)。但是,您不能对引用类型变量进行 by reference 赋值。为什么你认为你想这样做?你想达到什么目的?

标签: c# reference


【解决方案1】:

String 对象是不可变的:它们在创建后无法更改。 b = "let me rewrite this" 在 a hip 中创建了一个新对象并将该对象的地址分配给 b。 c 仍然有旧对象的地址。

如果要绑定两个变量,请尝试使用引用。

  string b = "This is changed";
    ref string c =  ref b;
    Console.WriteLine(c);
    b = "let me rewrite this";
    Console.WriteLine(c);
    b = "let me rewrite this again";
    Console.WriteLine(c);
    c = "let me reverse";
    Console.WriteLine(b);
    Console.WriteLine(c);

输出

This is changed
let me rewrite this
let me rewrite this again
let me reverse
let me reverse

我不明白要达到什么目的,但试试这个,它可能对你有用。

public TransactionalProducer (ref IMessageBusProducer bus, bool hasTransactionInitialized)

它会到达你的内部总线生产者,但我不确定它是否会导致内存泄漏。

【讨论】:

  • 那么我对类本身所做的应该正确使用引用吗?
  • @noob 我不知道你需要什么。尝试使用参考。检查我的答案更新。
  • 好的,我的立场是正确的。在非常现代的 C# 中,您可以对引用类型变量进行 by reference 赋值。我不期待对包含此功能的代码进行第一次代码审查
  • @Serge:赞成,但是推荐对那些没有得到参考的人的参考,这不是最好的主意 ;)
  • @WiktorZychla 感谢您的反馈。是的,我同意你的看法。我记得我在使用经典 C 时的美好时光。我有时仍然会做指针指向指针的噩梦。
猜你喜欢
  • 2021-11-11
  • 2022-09-27
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多