问题标签 [reference-type]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3564 浏览

c# - C# 与结构内的列表混淆(值类型与引用类型)

所以我今天发现,结构和类在 C# 中用于分配给变量时的行为不同。据我了解,当我将结构分配给变量时,变量存储该结构的副本,而当我分配一个类时对于一个变量,该变量存储对该类实例的引用。

在这种情况下,dad2 包含 dad1 的副本,所以我对 dad2 所做的任何事情都不应该影响 dad1 吗?显然情况并非如此,因为当我将儿子添加到 dad2 时,它也会将同一个儿子添加到 dad1。

0 投票
3 回答
1777 浏览

c# - 为什么字符串表现为值类型,即使它是 c# 中的引用类型

可能重复:
在 C# 中,为什么 String 是一种行为类似于值类型的引用类型?

我知道 string 是一种引用类型,因为 string 可以非常大而堆栈只有 1 mb 。但是在编码时以编程方式我看到它的行为类似于值类型,例如

现在 str 得到值 hello ?

为什么这样 ?它和这里的值类型完全一样。

0 投票
3 回答
11884 浏览

c# - 在 C# 中,值类型是可变的还是不可变的?

值类型行为表明,我们持有的任何值都不能通过其他变量来更改。

但是我仍然对我在这篇文章的标题中提到的内容感到困惑。谁能澄清一下?

0 投票
4 回答
7352 浏览

c# - 使用 ref 传递引用类型会节省内存吗?

在 C# 中,方法的参数可以是引用类型或值类型。传递引用类型时,传递引用的副本。这样,如果在方法内部我们尝试将传递的引用重新分配给另一个对象实例,则在方法外部重新分配是不可见的。

为了使其工作,C# 具有 ref 修饰符。使用 ref 传递引用类型实际上使用原始引用而不是副本。(如我错了请纠正我)。

在这种情况下,由于我们没有创建引用的副本,我们是否节省了任何内存?如果一个方法被广泛调用,这是否会提高应用程序的整体性能?

谢谢!

0 投票
1 回答
61 浏览

.net - 理解引用类型的问题

我从 WCF 服务 ObservableCoolection 获得

在我从 Web 服务中获取这些集合后,选定的项目由网格设置,然后我执行以下操作:

为什么在那之后集合中的所有项目都不为空?

如果我做:

那么 x 也将为空;

为什么会有不同?

0 投票
2 回答
3344 浏览

c# - 如何检查泛型方法参数是否为值类型?

有没有办法检查变量是否是引用类型的值类型?

想象:

0 投票
4 回答
1528 浏览

c# - Mutex 对象是通过引用传递的吗?

我正在从一个类构造几个对象,并使用这些类中的特定函数来启动线程。现在,包含构造这些对象的成员函数的类有一个静态私有 Mutex 成员。我将此静态成员传递给构造函数,并且在每个构造函数内部,传递的 Mutex(可能是通过引用)被分配给另一个本地成员。

如果我然后使用这些本地互斥锁成员中的每一个来确保线程安全,我能做到这一点吗?我指望这样一个事实,无论存在多少包含 Thread 函数的对象的不同实例,因为它们都引用同一个 Mutex 对象,如果正确使用,可以确保线程安全。

请找到下面的代码片段来代表这个想法:

0 投票
2 回答
86 浏览

.net - .NET 原语似乎一半在价值世界中,一半在参考世界中

如果值类型是对象(我已经看到 ValueType 确实继承自 Object),为什么它们不表现为对象?它们不能为空,因此它们似乎没有参考,并且它们必须被装箱/拆箱。当作为参数传递时,它们的行为类似于原语,但由于您可以在它们上调用方法,它们似乎也表现为引用类型。我读到它们通常分配在堆栈上,这使它们再次看起来像值类型。就装箱而言,我没有看到 int 和 Integer 的 Java 等价物,只有 Int32 结构,所以如果 Int32 被装箱,它装箱到什么?

简而言之,如果有人能解决他们似乎站在一个世界的一半,另一个世界的一半,我当然会很感激。

0 投票
7 回答
12477 浏览

c# - 为什么委托是引用类型?

关于已接受答案的快速说明:我不同意Jeffrey 回答的一小部分,即由于Delegate必须是引用类型,因此所有委托都是引用类型。(多级继承链排除值类型是不正确的;例如,所有枚举类型都继承自System.Enum,而继承自,System.ValueType继承自所有引用类型。)但是我认为事实是,从根本上说,实际上所有代表不仅继承自,而且继承自是这里的关键实现。正如雷蒙德在对的评论中指出的那样System.ObjectDelegateMulticastDelegate回答,一旦你承诺支持多个订阅者,考虑到某个地方需要一个数组,不为委托本身使用引用类型真的没有意义。


见底部更新。

如果我这样做,我总是觉得奇怪:

我每次都在创建一个新对象。 Action我确信成本是最低的,但它涉及分配内存以供以后进行垃圾收集。

鉴于委托本身不可变的,我想知道为什么它们不能是值类型?然后像上面那样的一行代码只会导致对堆栈上的内存地址的简单分配*。

即使考虑匿名函数,(对我而言)这似乎也可行。考虑以下简单示例。

在这种情况下foo确实构成了一个闭包,是的。在许多情况下,我想这确实需要一个实际的引用类型(例如当局部变量被关闭并在闭包中被修改时)。但在某些情况下,它不应该。例如在上面的例子中,支持闭包的类型看起来可能是这样的: 我收回我原来的观点。下面确实需要是一个引用类型(或者:它不需要是,但如果它是一个struct它只会被装箱)。所以,忽略下面的代码示例。我只留下它来为特别提到它的答案提供上下文。

这个问题有意义吗?在我看来,有两种可能的解释:

  • 将委托正确地实现为值类型需要额外的工作/复杂性,因为支持诸如修改局部变量值的闭包之类的东西无论如何都需要编译器生成的引用类型。
  • 还有一些其他的原因,在幕后,委托根本无法实现为值类型。

最后,我并没有为此失眠;这只是我一直好奇的事情。


更新:为了回应 Ani 的评论,我明白了为什么CompilerGenerated上面示例中的类型也可能是引用类型,因为如果委托将包含一个函数指针和一个对象指针,它无论如何都需要一个引用类型(在至少对于使用闭包的匿名函数来说,因为即使你引入了一个额外的泛型类型参数——例如Action<TCaller>——这不会涵盖无法命名的类型!)。然而,所有这一切都让我后悔将编译器生成的闭包类型的问题带入讨论!我的主要问题是关于delegates,即带有函数指针和对象指针的东西。在我看来,这仍然一种价值类型。

换句话说,即使这...

...需要创建一个引用类型对象(以支持闭包,并为委托提供参考),为什么需要创建两个(支持​​闭包的对象加上Action委托)?

*是的,是的,实现细节,我知道!我真正的意思是短期记忆存储

0 投票
2 回答
388 浏览

c# - 通过 ref 传递给另一个方法的 Reference-Type 不返回更新值

我面临以下问题:

我需要从我的控制器调用我的域层;它调用一个 Web 服务方法,该方法通过引用 (ref) 接收请求。

控制器代码:

领域层(WorkflowService.cs 类):

IF_wcfClient.RequestSomething在返回请求对象时修改 Errors 集合具有此错误更新的错误集合。但是,一旦将控制权返回给控制器并检查了错误集合,那么我的更新就消失了。

Edit00:哦,无耻的插头,我是代表 14,我试图提出一些对我有用的问题/答案,它说我不能因为我的水平低。

Edit01:非常感谢迪伦,看到有这样一个网站来指出人们可能会错过的非常小的事情总是很好的。将值返回给我的更新代码如下所示:

领域层(WorkflowService.cs 类):