在MVVM中,我们通常有一个View(XAML +通常是空代码隐藏)以及一个单独的ViewModel.View和ViewModel之间的交互通过数据绑定进行.
假设View只是XAML并且其代码隐藏是空的(通常就是这种情况),使用代码隐藏本身作为ViewModel并将View绑定到代码隐藏的属性是否有任何问题?关注点的分离仍然存在 - 您有一个纯XAML视图和一个ViewModel,它是代码隐藏,它们只通过数据绑定相互通信.ViewModel仍然可以进行单元测试.
这听起来像是异端邪说,但是当代码隐藏实际上是空的时候,我无法想到任何可以证明必须为ViewModel创建单独类的用例.
在最近的异步/等待模式中,建议使用"Async"结束方法名称,例如" GetAsync() ".
现在假设我使用旧的异步模式,即具有Begin/End方法对的模式IAsyncResult.我有一个方法来包装对该方法的调用,例如:
public void SendAsync(byte[] data)
{
this.stream.BeginWrite(...);
}
Run Code Online (Sandbox Code Playgroud)
还假设EndWrite传递给的方法BeginWrite对于所有数据都是相同的,即它将是同一类中的方法.
在这种情况下,命名此方法是错误的,SendAsync()因为它可能与新的异步模式混淆?
除了Flush()方法,我注意到Stream类还有一个FlushAsync()方法。在什么情况下您会使用FlushAsync()方法?刷新缓冲区是否如此昂贵以保证异步运行它?
在Redis中,有一个MONITOR命令非常方便地查看正在处理的所有命令。
一旦开始监视,是否有任何方法可以停止同一会话的监视?
如果终止连接,监视是否结束(与服务器上继续进行的资源密集型监视相反)?
我想打电话给IDatabase.SortedSetAsync(StackExchange.Redis).此方法的签名是:
Task<bool> SortedSetRemoveAsync(RedisKey key, RedisValue member,
CommandFlags flags = CommandFlags.None);
Task<long> SortedSetRemoveAsync(RedisKey key, RedisValue[] members,
CommandFlags flags = CommandFlags.None);
Run Code Online (Sandbox Code Playgroud)
传递一个隐式转换为RevisValue的值(例如字符串)没有问题.但是,如果我尝试传入数组...
var key = "MYKEY";
var values = new string[] { "A", "B", "C" };
await database.SortedSetRemoveAsync(key, values);
Run Code Online (Sandbox Code Playgroud)
...然后编译器不知道如何将字符串[]转换为RedisValue [].
我管理转化的唯一方法是进行每项转化:
var values2 = values.Select(s => (Redisvalue) s).ToArray();
await database.SortedSetRemoveAsync(key, values2);
Run Code Online (Sandbox Code Playgroud)
......我不确定这是否是最佳方式.
很奇怪,当存在期望数组的API方法时,传递数组是如此困难...... 单元测试通过传入一个空的RedisValue []数组并完全绕过问题来实现简单方向.
将数组参数传递给接受RedisValue []数组的StackExchange.Redis方法的推荐方法是什么?
在MSDN页面中TimeZoneInfo.ConvertTimeToUtc(),有以下信息框:
如果当前计算机的本地时区包含多个调整规则,则ConvertTimeToUtc方法的此重载可以返回与TimeZone.ToUniversalTime和DateTime.ToUniversalTime方法不同的结果.无论dateTime是否在其日期范围内,TimeZone.ToUniversalTime始终将当前调整规则应用于时区转换.在.NET Framework 3.5上执行时,DateTime.ToUniversalTime也会将当前调整规则应用于时区转换,无论dateTime是否位于其日期范围内.
我不确定我明白这意味着什么.这些是什么调整规则,以及如何将结果之间的差异ConvertTimeToUtc()和TimeZone.ToUniversalTime()?
我一直在做一些关于在数据库中安全存储密码的研究。通常建议您使用盐。正如Secure hash and salt for PHP passwords中的一个答案所解释的那样,这会更改哈希值,使密码更难以破解。
作为验证机制的一部分,用户输入的密码与盐结合并根据需要进行散列。鉴于盐对用户是透明的,使用盐如何提供任何额外的好处?
在我看来,无论有没有散列,相同的密码都将成功验证您的身份,因为使其与众不同的管道将在幕后进行。这就是为什么到目前为止我读过的文章都没有澄清事情的原因。
我通过使用FlowDocument,FlowDocumentPaginator和PrintDialog在WPF中打印纯文本。我的方法基于本文,并且实现如下:
var printDialog = new PrintDialog();
if (printDialog.ShowDialog() == true)
{
var flowDocument = new FlowDocument();
var paragraph = new Paragraph();
paragraph.FontFamily = new FontFamily("Courier New");
paragraph.FontSize = 10;
paragraph.Margin = new Thickness(0);
paragraph.Inlines.Add(new Run(this.textToPrint));
flowDocument.FontSize = 10;
flowDocument.Blocks.Add(paragraph);
var paginator = ((IDocumentPaginatorSource)flowDocument).DocumentPaginator;
printDialog.PrintDocument(paginator, "Chit");
}
Run Code Online (Sandbox Code Playgroud)
这对于打印宽度较窄的东西很有用。但是,当我尝试打印一个长字符串时,它们全部塞在一个小区域中:
我在打印对话框PrintTicket和分页器中检查了尺寸,它们似乎还可以:
那么,是什么导致此问题,我该如何解决?
默认情况下,使用C#7元组时,该项目将命名为喜欢的Item1,Item2等.
我知道你可以命名由方法返回的元组项.但是,您可以使用相同的内联代码,例如在以下示例中吗?
foreach (var item in list1.Zip(list2, (a, b) => (a, b)))
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
在foreach我的身体中,我希望能够使用比和更好的东西访问最后的元组(包含a和b).Item1Item2
我想使用NAudio获取默认输出音频设备(即我的扬声器),以获得此问题中的主音量.
我正在尝试使用MMDeviceEnumerator.GetDevice(),但它所需的ID是一个字符串,而不是设备号.这是我到目前为止编写的代码:
var enumerator = new MMDeviceEnumerator();
for (int i = 0; i < WaveOut.DeviceCount; i++)
{
var cap = WaveOut.GetCapabilities(i);
Console.WriteLine("{0}: {1}", i, cap.ProductName);
var device = enumerator.GetDevice(???);
}
Console.WriteLine();
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
我已经尝试从功能中传递各种Guids,以及以字符串格式传递设备ID,GetDevice()但它们都不起作用.
如何获取默认设备?