我有这段代码检查两个变量的引用,我遇到了这种情况,这有点令人困惑:
string first = "10";
object second = 10.ToString();
dynamic third = second;
Console.WriteLine($"{first == second} {first == third}");
Run Code Online (Sandbox Code Playgroud)
结果是:False True
我的第一个问题是为什么第一个和第三个引用相等?如果第三个变量等于第二个变量,那应该是False
因为它们的对象引用不相等。
当我将值更改为"1"
如下所示时,我感到很困惑:
string first = "1";
object second = 1.ToString();
dynamic third = second;
Console.WriteLine($"{first == second} {first == third}");
Run Code Online (Sandbox Code Playgroud)
那么结果就变成了:True True
为什么会出现这种情况?
有人可以解释Observable和ConnectableObservable之间的区别吗?Rx Extensions文档非常稀疏,我不明白ConnectableObservable在什么情况下是有用的.
此类用于Replay/Prune方法.
我已经使用了volatile,我不确定它是否有必要.我很确定锁定在我的情况下会有点过分.阅读这个帖子(Eric Lippert评论)让我对使用volatile感到焦虑:什么时候应该在c#中使用volatile关键字?
我使用volatile是因为我的变量在多线程上下文中使用,其中可以同时访问/修改此变量,但是我可以在没有任何伤害的情况下松散添加(参见代码).
我添加"挥发性",以确保有不发生未命中对准:在另一个取可以在2通过在从另一个线程中间的写入被打破仅读取32可变的比特和其他32位.
我先前的假设(先前的陈述)是否真的可以发生?如果没有,"挥发性"使用是否仍然是必要的(选项属性修改可能在任何线程中发生).
看了2个第一个答案.我想坚持代码编写方式的事实,如果由于并发性我们错过了一个增量(想要从2个线程递增但结果仅由于并发而增加1)并不重要变量'_actualVersion'递增.
作为参考,这是我正在使用它的代码的一部分.仅在应用程序空闲时报告保存操作(写入磁盘).
public abstract class OptionsBase : NotifyPropertyChangedBase
{
private string _path;
volatile private int _savedVersion = 0;
volatile private int _actualVersion = 0;
// ******************************************************************
void OptionsBase_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
_actualVersion++;
Application.Current.Dispatcher.BeginInvoke(new Action(InternalSave), DispatcherPriority.ApplicationIdle);
}
// ******************************************************************
private void InternalSave()
{
if (_actualVersion != _savedVersion)
{
_savedVersion = _actualVersion;
Save();
}
}
// ******************************************************************
/// <summary>
/// Save Options
/// </summary>
private void Save()
{
using (XmlTextWriter writer = new XmlTextWriter(_path, null)) …
Run Code Online (Sandbox Code Playgroud) 我的应用程序中有一个包含子控件的groupbox.(如附图中所示).我想枚举所有文本框,使用简单的foreach循环执行一些验证.
本文件大纲将对控制的住房提供一个公平的概念
foreach (Control control in grpBxTargetSensitivity.Controls)
{
if (control is FlowLayoutPanel && control.HasChildren)
{
foreach (Control ctrl in control.Controls)
{
if (ctrl is Panel && ctrl.HasChildren)
{
foreach (Control tbox in ctrl.Controls)
{
if (tbox is TextBox)
{
TextBox textbox = tbox as TextBox;
validData &= !string.IsNullOrWhiteSpace(textbox.Text);
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否有更好的方法(可能通过LINQ)获得所有控件,包括容纳在面板内的文本框,而不是上述方法.
到现在为止,我还热心地保持每个参考IDisposable
任何返回.Subscribe(...)
,.Connect(...)
在RX等,方法.我之所以这样做,是因为我担心如果我不保留参考,垃圾收集将丢弃一次性物品.
但是,我做了一个测试在LINQPad在那里我做了一些电话GC.Collect()
上.Subscribe(...)
,我没有保持基准和猜测什么?世界没有结束,订阅也完成了.
在进一步测试中,我发现我的订阅在.OnComplete()
没有我干预的情况下立即被处理掉.
这使我理解,至少对于.Subscribe(...)
,保持对订阅的引用的唯一原因是强制订阅在其正常完成之前结束.它更像是取消令牌.
所有Rx一次性用品都用于取消而不是保持活力吗?
那么,什么是挂在上面的规则IDisposable
?
我正在看一个问题,该问题讨论的是 Fisher-Yates shuffle 算法的错误实现,但我对错误实现时存在偏差感到困惑。
这两个算法是:
private Random _random = new Random();
public int[] FisherYates(int[] source)
{
int[] output = source.ToArray();
for (var i = 0; i < output.Length; i++)
{
var j = _random.Next(i, output.Length);
(output[i], output[j]) = (output[j], output[i]);
}
return output;
}
public int[] FisherYatesBad(int[] source)
{
int[] output = source.ToArray();
for (var i = 0; i < output.Length; i++)
{
var j = _random.Next(0, output.Length);
(output[i], output[j]) = (output[j], output[i]);
}
return output;
}
Run Code Online (Sandbox Code Playgroud)
一个非常微妙的不同,但足以引起巨大的偏见。
良好的实施:
错误的实现: …
我正在创建一个Validator<T>
班级.我正在尝试SelectMany
为我的验证器实现Linq 扩展方法,以便能够使用Linq查询组合表达式,并在基础值发生更改时验证最终结果.
以下测试代码演示了我的意图.
var a = 2;
var b = 3;
var va = Validator.Create(() => a, n => n >= 0 && n < 5);
var vb = Validator.Create(() => b, n => n >= 0 && n < 5);
var vc = from ia in va
from ib in vb
select ia + ib;
Debug.Assert(vc.Value == a + b); //2 + 3
Debug.Assert(vc.Value == 5);
Debug.Assert(vc.IsValid == true);
a = 7;
Debug.Assert(vc.Value == a …
Run Code Online (Sandbox Code Playgroud) 我正在尝试了解 async 和 await 在 C# 中的工作方式。
考虑以下两个片段:
var appIdTask = GetAppIdAsync();
var clientSecretTask = GetClientSecretAsync();
var appId = await appIdTask;
var clientSecret = await clientSecretTask;
Execute(appId, clientSecret);
Run Code Online (Sandbox Code Playgroud)
和
var appId = await GetAppIdAsync();
var clientSecret = await GetClientSecretAsync();
Execute(appId, clientSecret);
Run Code Online (Sandbox Code Playgroud)
这两个片段有不同的含义。正确的?
第一个将并行进行 Get 调用,而第二个将进行串行调用?
根据我的理解,第一次调用的 await 关键字会阻止第二次调用的执行。
我正在使用开源客户端以编程方式处理传入的电子邮件(在Windows 2003上).防止接收先前读取的电子邮件的唯一方法是从服务器中删除它们.这不太理想.据我所知,Pop3中没有命令将电子邮件设置为正在读取.那么你怎么做呢?
I have a bunch of SKUs (stock keeping units) that represent a series of strings that I'd like to create a single Regex to match for.
So, for example, if I have SKUs:
var skus = new[] { "BATPAG003", "BATTWLP03", "BATTWLP04", "BATTWSP04", "SPIFATB01" };
Run Code Online (Sandbox Code Playgroud)
...I'd like to automatically generate the Regex to recognize any one of the SKUs.
I know that I could do simply do "BATPAG003|BATTWLP03|BATTWLP04|BATTWSP04|SPIFATB01"
, but list of SKUs can be quite lengthy and I'd like to …
c# ×7
.net ×6
linq ×3
.net-6.0 ×1
async-await ×1
asynchronous ×1
dispatcher ×1
idisposable ×1
lambda ×1
performance ×1
pop3 ×1
random ×1
regex ×1
volatile ×1