我刚才注意到给出以下代码:
if (x.ID > 0 && !x.IsCool)
Run Code Online (Sandbox Code Playgroud)
Microsoft C#3.0(VS2008 SP1)编译器将优化它:
if (!((x.Id <= 0) || x. IsCool))
Run Code Online (Sandbox Code Playgroud)
这是在未启用优化的Debug构建中.为什么编译器会这样做?它在执行方面更快吗?
我用Reflector找到了(我实际上是在寻找不同的东西)
直到今天,我仍然生活在使用RSA的RSA加密是确定性的印象中.毕竟,签名验证如果不是,应该如何工作?
令我惊讶的是,RSACryptoServiceProvider当使用相同的密钥加密相同的字节集时,.NET 没有稳定的输出:
[Fact]
public void Learning()
{
const int keySize = 1024;
System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(keySize);
var bytes = GenerateRandomDataWithLength( 36 );
for (int i = 0; i < 4; i++)
Assert.Equal( rsa.Encrypt( bytes, false ), rsa.Encrypt( bytes, false ) );
}
byte[] GenerateRandomDataWithLength( int length )
{
Random r = new Random();
byte[] data = new byte[length];
r.NextBytes( data );
return data;
}
Run Code Online (Sandbox Code Playgroud)
我已经浏览了PKCS规范,我确实理解了RSA背后的数学,所以我真的很想知道为什么我观察输出是不稳定的.
Mono的RSA实现具有稳定的输出.不稳定的输出Encrypt不会影响解密,这很可能并产生预期的数据.
我知道.NET内存模型(在.NET Framework上;不是compact/micro/silverlight/mono/xna/what-have-you)保证对于某些类型(最值得注意的是原始整数和引用)操作保证是原子.
此外,我相信x86/x64测试和设置指令(和Interlocked.CompareExchange)实际上引用了全局内存位置,因此如果成功,另一个Interlocked.CompareExchange将看到新值.
最后,我相信volatile关键字是指令编译器尽快传播读写操作并不重新排序有关此变量的操作(对吗?).
这导致了一些问题:
Interlocked.Read没有int的重载,只有longs(2个WORD,因此通常不会原子读取).我一直认为.NET内存模型保证在读取整数/引用时会看到最新的值,但是使用处理器缓存,寄存器等等.我开始意识到这可能是不可能的.那么有没有办法强制重新获取变量?如果有两个全局整数变量x和y,则初始化为0,如果我写:
x = 1;
y = 2;
Run Code Online (Sandbox Code Playgroud)
那个NO线程将看到x = 0和y = 2(即写入将按顺序发生).如果它们不稳定,这会改变吗?
我有一个发布分支(RB,从C5开始)和trunk(C10)上的变更集,我现在想要合并到RB上.
该文件在C3处变化(两者共用),一个在RB上的CS 7中,一个在C9(中继)中,一个在C10中).因此,我更改的文件的历史记录如下所示:
RB: C5 -> C7
Trunk: C3 -> C9 -> C10
Run Code Online (Sandbox Code Playgroud)
当我将C10从主干合并到RB时,我希望看到一个合并窗口显示我,
C10 | C3 | C7因为C3是共同的祖先修订版,C10和C7分别是我的两个分支的提示.但是,我的合并工具告诉我C10 | C9 | C7.
我的合并工具配置为显示%1(OriginalFile)|%3(BaseFile)|%2(Modified File),所以这告诉我TFS选择C9作为基本修订版.
这完全出乎意料,完全违背了我在Mercurial或Git中使用的合并方式.我有什么问题或是TFS试图通过合并让我疯狂吗?
这是默认的TFS合并行为吗?如果是这样,您能否提供有关他们选择以这种方式实施的原因的见解?
我正在使用TFS 2008和VS2010作为客户端.
我正在尝试使用MonoDevelop下的NuGet包恢复来编译Visual Studio项目,但它不是开箱即用的.
NuGet应该在Mono上工作,甚至还有nuget.targets内置的支持,那么缺少什么?
我想从新的远程存储库跟踪远程主分支.两者都已存在.
我怎么用git来解决这个问题?我似乎无法做对.我试过了:
git remote add otherRepo git://...
git branch -t myTrack otherRepo/master
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
fatal: Not a valid object name: 'otherRepo/master'.
根据MSDN:
因为匿名类型上的Equals和GetHashCode方法是根据属性的Equals和GetHashcode定义的,所以同一匿名类型的两个实例只有在它们的所有属性相等时才相等.
但是,以下代码演示了编译器生成的实现Equals()不符合预期:
DateTime start = new DateTime(2009,1,1);
DateTime end = new DateTime(2010, 12,31);
// months since year 0
int startMonth = start.Date.Year * 12 + start.Date.Month - 1;
int endMonth = end.Date.Year * 12 + end.Date.Month -1 ;
// iterate through month-year pairs
for (int i = startMonth; i <= endMonth ; i++)
{
var yearMonth = new { Year = (int)Math.Truncate(i/12d), Month = (i % 12) + 1};
if (yearMonth.Year == 2009 && yearMonth.Month …Run Code Online (Sandbox Code Playgroud) 如果还有另一种方法可以实现我在下面尝试做的事情,请告诉我.假设我有以下示例代码
type FooBar =
| Foo
| Bar
let foobars = [Bar;Foo;Bar]
let isFoo item =
match item with
| Foo _ -> true
| _ -> false
foobars |> Seq.filter isFoo
Run Code Online (Sandbox Code Playgroud)
我想编写isFoo的通用/高阶版本,它允许我根据所有其他类型的区分联合(在这种情况下为Bar)过滤我的列表.
像下面的东西,'可以是Foo或Bar
let is<'a> item =
match item with
| a _ -> true
| _ -> false
Run Code Online (Sandbox Code Playgroud)
但是,此尝试会产生以下错误:
错误FS0039:未定义模式鉴别器"a"