问题标签 [callermembername]

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 回答
1726 浏览

c# - 抑制 C# 中的“成员从未分配给”警告

我有以下代码:

使用 ReactiveUI INPC 支持。编译器总是警告我Trochoid从未分配过并且永远为空。然而,由于RaiseAndSetIfChanged通过CallerMemberName支持执行的魔法,代码确实有效并且编译器是错误的。

如何在我的代码中干净地抑制这些警告?

0 投票
3 回答
3459 浏览

c# - MVVM CallerMemberName 和“魔术字符串”

新的 C# 5.0 版本引入了一些东西来摆脱 INotifyPropertyChanged 实现中的“魔术字符串”,例如:

现在可以只写:

由于方法定义中的 CallerMemberName ,这是可能的:

它比“魔术字符串”方式更易于重构,并且比 lambda 表达式更快,但我想知道我们如何从一组访问器中多次调用 OnPropertyChanged。例如,如果我们想要这样的东西:

我们如何使用 CallerMemberName 方式做到这一点并避免使用“魔术字符串”和 lambda 表达式?

我还想知道如何避免在 IDataError 信息中使用“魔术字符串”:

我是 MVVM 的新手,所以也许我忽略了一些处理“魔术字符串”的聪明方法,但是我做了一些研究,却一无所获。

0 投票
2 回答
4310 浏览

c# - 覆盖 GetEnumerator 的默认行为

我有一个要求,我需要知道GetEnumerator().

我能想到的最好的方法可能是将默认行为覆盖到GetEnumerator我创建的行为上,GetEnumerator([CallerMemberName]string caller = null)但我似乎无法这样做,因为任何调用它的东西仍然会使用原始行为。

一些调用代码的示例可能是

目的是我想知道"button1_click"例如GetEnumerator()方法

0 投票
1 回答
269 浏览

c# - 为什么呼叫者信息属性以它们的方式实现?

当前实现的缺点:

  • 它们违反了 DRY 原则,因为您必须在需要它们的任何地方重写参数
  • 它们破坏了实现隐藏,因为您必须在接口中指定这些参数 - 即使您的接口实现中只有一个需要它们
  • 它们弄脏了您的界面,用户在自动完成、文档等中看到它们。

为什么语言设计者决定反对更有用的东西,例如:

我猜这个实现缺少一些特性:例如,如果 Foo() 是一个实现 IFoo 的类并且 IFoo 在另一个程序集中,那么任何 IFoo 的调用者应该如何在编译时知道该信息是必需的——他不知道。

但!记录这仅在一个“构建步骤”内有效而不是产生无法作为当前实现的东西不是更好吗?

Q1:是否有官方文档说明为什么会以现在的方式实施?

Q2:有人知道其他语言的更好解决方案吗?

0 投票
3 回答
26587 浏览

c# - .NET 4.0 中的 CallerMemberName 不起作用

我正在尝试CallerMemberName通过 BCL 可移植包在 .NET 4.0 中使用属性。它总是返回一个空字符串而不是成员名称。我究竟做错了什么?

0 投票
2 回答
16299 浏览

c# - WPF 通知 PropertyChanged 获取属性

我已经INotifyPropertyChanged使用CallerMemberName

因此,这可以在任何属性的设置器中调用,因为OnPropertyChanged()它会在设置属性时通知属性更改事件。对于仅作为 getter 的属性而言,情况并非如此。例如,

OnPropertyChanged()DateOfBirth 工作正常,但要通知 Age 已更改,我应该记得OnPropertyChanged("Age")DateOfBirth. 我觉得这使得代码随着时间的推移难以维护。如果一个新属性依赖于年龄,那也需要在 DateOfBirth 的设置器中通知。有没有更好的方法可以在不调用 OnPropertyChanged("Age") 的情况下做到这一点?

0 投票
1 回答
33074 浏览

c# - 在实施 INotifyPropertyChanged 时,[CallerMemberName] 是否比替代方案慢?

有很好的文章提出了不同的实现方式INotifyPropertyChanged

考虑以下基本实现:

我想用这个替换它:

但有时我读到该[CallerMemberName]属性与替代品相比性能较差。这是真的吗?为什么?它使用反射吗?

0 投票
1 回答
839 浏览

c# - 获取调用者方法名称 - 反射和 CallerInfo 属性

StackTrace刚刚对使用和的性能进行了基准测试CallerInfo Attributes

令人震惊的是,我发现StackTrace尽管在我阅读的每个地方,使用都快得多To get the caller method name, the preferred approach is CallerInfo attributes

输出:在 1000 次迭代中使用 StackFrame 检索调用方名称的经过时间 =9.48074760000001

在 1000 次迭代中使用 callerInfo 属性检索来电者姓名的经过时间 =21.7074064

我有什么误解吗?使用CallerInfo属性是首选方法吗?

感谢以下答案的指出。

每次循环中我都必须重新启动计时器。

那么,谁赢了?正如下面的答案所说,CallerInfo。因为,它是一个编译时特性并且速度更快。

在 1000 次迭代中使用 StackFrame 检索调用方名称的经过时间 =0.00762619999999992

在 1000 次迭代中使用 callerInfo 属性检索来电者姓名的经过时间 =0.00639420000000002

我使用了以下代码(已修改)并得到了上述结果。

0 投票
4 回答
3556 浏览

c# - 为什么 C# 调用者信息属性需要默认值?

我刚刚遇到了 C# 5 调用者信息属性 ( http://msdn.microsoft.com/en-us/library/hh534540.aspx )。

这似乎是一个非常有用的功能,我已经阅读了一些文档(http://www.codeproject.com/Tips/606379/Caller-Info-Attributes-in-Csharp)。

但是,我只是想知道:为什么必须传入默认值?它们是如何使用的?

以下示例代码显示了如何使用调用者信息属性:

我的问题是: 、 和 的默认值nullnull什么-1?上面的代码与以下代码有何不同:

按照我的理解,这些是可选参数,编译器提供默认值,替换我们分配的任何默认值。在那种情况下,我们为什么要指定默认值?是否存在一些奇怪的边缘情况,编译器可能无法填写值,并诉诸我们提供的默认值?如果不是,那么为什么要求我们输入这些数据?要求开发人员提供永远不会使用的默认值似乎相当笨拙。

免责声明:我尝试用谷歌搜索,但我找不到任何东西。我几乎不敢问关于 SO 的问题,因为大多数这样的新手问题都会遇到这样的敌意,但作为最后的手段,我会冒险提出一个问题。版主/高级用户,无意冒犯 - 在发布此之前,我确实尝试过在其他地方查找信息。

0 投票
2 回答
2407 浏览

c# - 获取类名

如何获得class-namewith caller info attributes

strongly say a no使用反射记录类名。

能够使用[CallerMemberName]以下方法获取方法名称:

如何使用Caller Info Attributesclass name在此处记录?