小编NtF*_*reX的帖子

.NET JIT编译器易失性优化

https://msdn.microsoft.com/en-us/magazine/jj883956.aspx

考虑轮询循环模式:

private bool _flag = true; 
public void Run() 
{
    // Set _flag to false on another thread
    new Thread(() => { _flag = false; }).Start();
    // Poll the _flag field until it is set to false
    while (_flag) ;
    // The loop might never terminate! 
} 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,.NET 4.5 JIT编译器可能会像这样重写循环:

if (_flag) { while (true); } 
Run Code Online (Sandbox Code Playgroud)

在单线程的情况下,这种转换是完全合法的,一般来说,提升循环读取是一个很好的优化.但是,如果_flag在另一个线程上设置为false,则优化可能会导致挂起.

请注意,如果_flag字段是volatile,则JIT编译器不会提升循环读取.(有关此模式的更详细说明,请参阅12月文章中的"轮询循环"部分.)

如果我锁定_flag或仅使其volatile停止优化,JIT编译器是否仍会如上所示优化代码?

Eric Lippert对于volatile有如下说法:

坦率地说,我不鼓励你做一个不稳定的领域.易失性字段表明你正在做一些彻头彻尾的疯狂:你试图在两个不同的线程上读取和写入相同的值,而不是锁定到位.锁定保证锁内部读取或修改的内存一致,锁定保证一次只有一个线程访问给定的内存块,依此类推.锁定速度太慢的情况非常少,并且由于您不了解确切的内存模型而导致代码错误的可能性非常大.除了Interlocked操作最琐碎的用法之外,我不会尝试编写任何低锁代码.我将"挥发性"的用法留给了真正的专家.

总结一下:谁确保上面提到的优化不会破坏我的代码?只有volatile?另外,lock声明?或者是其他东西?

由于Eric Lippert不鼓励你使用volatile,必须有别的东西?


Downvoters:我很感激每个问题的反馈.特别是如果你贬低它,我想听听你为什么认为这是一个糟糕的问题. …

.net c# multithreading jit volatile

13
推荐指数
1
解决办法
485
查看次数

如何修复 CA1000 不要在泛型类型上声明静态成员

我正在使用Microsoft.CodeAnalysis.FxCopAnalyzers,CA1000规则如下。

不要在泛型类型上声明静态成员。

如何纠正违规行为

要修复违反此规则的问题,请删除静态成员或将其更改为实例成员。

何时抑制警告:

不要抑制此规则的警告。以易于理解和使用的语法提供泛型可以减少学习所需的时间并提高新库的采用率。

我的代码如下。该Success方法是触发规则的方法。

public class ResultResponse
{
    internal ResultResponse(bool isSuccess)
    {
        IsSuccess = isSuccess;
    }

    public bool IsSuccess { get; }

    public static ResultResponse Failed()
        => new ResultResponse(false);
}

public class ResultResponse<T> : ResultResponse
{
    internal ResultResponse(T value, bool isSuccess)
        : base(isSuccess)
    {
        Value = value;
    }

    public T Value { get; }

    public static ResultResponse<T> Success(T value)
        => new ResultResponse<T>(value, true);
}
Run Code Online (Sandbox Code Playgroud)

我可以将构造函数公开并在上面的示例中使用它,但我也有这样的情况,我想将构造函数保留在内部以确保正确使用类型。

将Success方法移至非泛型类型是正确的方法吗?

public class ResultResponse …
Run Code Online (Sandbox Code Playgroud)

c# .net-core

6
推荐指数
1
解决办法
2528
查看次数

最佳实践元组、动态或模型

什么时候是使用 aTuple代替某种模型类的好地方?不就是懒得用吗Tuples?

\n\n

我有时在项目的不同地方使用Tuplesor 有时dynamics,我问自己为每个创建一个模型类是否是一个很好的实践。

\n\n

活动

\n\n

我使用元组作为我在 PRISM 应用程序中编写的某些事件的有效负载,因为该类PubSubEvent仅采用一个通用类型参数。

\n\n

解决方案:

\n\n
    \n
  • 创建一个模型类并使用它
  • \n
\n\n

这样做是一个好的做法吗?

\n\n

JSON 参数解析

\n\n

当我有一个 Web API 访问点时,我希望将 json 字符串作为参数,有时我会将字符串转换为动态类型并从中读取属性并将其传递给我的经理。

\n\n

解决方案:

\n\n
    \n
  • 在Web客户端中编辑json并发送所需的数据
  • \n
  • 创建一个参数解析器(或者再次调用它们)并排除模型作为参数
  • \n
\n\n

这样做是一个好的做法吗?

\n\n

算法中的临时数据存储

\n\n

在某些算法中,我使用Tuples临时存储数据。我认为在这种背景下Tuples是一件好事。

\n\n

更多的?

\n\n

还有更多Tuples有用的地方吗?什么时候应该使用它们,什么时候不应该使用它们?

\n\n

微软软件定义网络

\n\n
\n

元组通常有四种使用方式:

\n\n
    \n
  1. 表示一组数据。例如,元组可以表示数据库记录,其组件可以表示记录的各个字段。
  2. \n
\n
\n\n

当使用数据库框架时,我认为这不是一个好的做法?

\n\n
\n
    \n
  1. 提供对数据集的轻松访问和操作。
  2. \n …

c# tuples

5
推荐指数
0
解决办法
1343
查看次数

.net 中的 JWT 生成和验证抛出“不支持密钥”

我使用以下代码生成并验证 JWT。

static string GenerateToken()
{
    var tokenHandler = new JwtSecurityTokenHandler();
    var certificate = new X509Certificate2(@"Test.pfx", "123");
    var rsa = certificate.GetRSAPrivateKey();

    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(),
        Issuer = "Self",
        IssuedAt = DateTime.Now,
        Audience = "Others",
        Expires = DateTime.MaxValue,
        SigningCredentials = new SigningCredentials(
            new RsaSecurityKey(rsa),
            SecurityAlgorithms.RsaSha256Signature)
    };

    var token = tokenHandler.CreateToken(tokenDescriptor);
    return tokenHandler.WriteToken(token);
}

static bool ValidateToken(string token)
{
    var tokenHandler = new JwtSecurityTokenHandler();
    var certificate = new X509Certificate2(@"Test.cer");
    var rsa = certificate.GetRSAPublicKey();

    var validationParameters = …
Run Code Online (Sandbox Code Playgroud)

c# rsa jwt .net-core .net-standard

3
推荐指数
1
解决办法
7964
查看次数

c#通过对象取消装箱

我可以投byte给int没有任何问题.

byte a = 2;
int b = a;      // => unboxing, boxing or conversion?
Run Code Online (Sandbox Code Playgroud)

当我byte先施展object,然后int我得到一个InvalidCastException.

byte a = 2;
object b = a;    // => boxing?
int c = (int) b; // => unboxing fails?
Run Code Online (Sandbox Code Playgroud)

但我可以通过使用来解决这个问题Convert.ToInt32.

byte a = 2;
object b = a;                // => boxing?
int c = Convert.ToInt32(b);  // => what happens here?
Run Code Online (Sandbox Code Playgroud)
  • 为什么我InvalidCastException在第二个例子中得到一个?
  • 这是什么Convert.ToInt32背景?
  • 难道我的标签boxing, …

c# boxing unboxing casting

3
推荐指数
1
解决办法
248
查看次数

使用环境变量启动进程

我想用以下路径开始一个过程。

“ProgramFiles(x86)\Philips Speech\Device Control Center PDCC.exe”

当我在控制台中输入此过程时,该过程按预期开始,但是当我尝试在代码中执行此操作时,出现以下异常:

该系统找不到指定的文件

这是我到目前为止的代码:

var startInfo = new ProcessStartInfo("%ProgramFiles(x86)%\Philips Speech\Device Control Center PDCC.exe");
Debug.Assert(startInfo.EnvironmentVariables.ContainsKey("ProgramFiles(x86)")) //Is true
new Process(startInfo).Start(); //<- exception occures here
Run Code Online (Sandbox Code Playgroud)

有人知道我是否可以通过为 ProcessStartInfo 类提供环境变量来直接执行此操作,或者我是否必须在这样做之前对其进行解析?

c# process environment-variables

2
推荐指数
2
解决办法
1958
查看次数

C#6.0默认初始化

以下代码在C#5.0中有效:

private static String _prefix;
public static String Prefix
{
    get { return _prefix; }
    set {_prefix = (value == String.Empty) ? "abc_" : value;}
} 
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用默认初始化在C#6中更简洁地编写它.(https://msdn.microsoft.com/en-us/magazine/dn802602.aspx)

以下代码在C#6.0中有效(但逻辑不同)

public String Prefix { get; set; } = "abc_";
Run Code Online (Sandbox Code Playgroud)

我尝试过:

public String Prefix { get; set; } value == String.Empty ? "abc_" : value

但由于当前上下文中不存在名称"value",因此失败

我该如何解决这个错误?

我要做的是将属性设置为"abc_",如果它为null或为空,如果它已经有值,请不要触摸它.

c# initialization properties c#-6.0

2
推荐指数
1
解决办法
713
查看次数

如何防止 Newtonsoft JsonSerializer 关闭流?

所以我还没有编写我现在正在处理的代码,我正在寻找如何最好地处理这个问题。

现在我有这个。

public static void WriteSymbol(Stream stream, Symbol symbol)
{
    using (var streamWriter = new StreamWriter(stream))
    {
        JsonSerializer.Create(SerializerSettings).Serialize(streamWriter, symbol);                
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中完成此操作后,我希望能够读取流的内容,以便我可以检查集成。问题是现在在 Serialize 流关闭后我无法再读取它。

我看到了 JsonWriter,public bool CloseOutput { get; set; }但我没有看到这个静态 JsonSerializer 的内容。

解决这个问题的最佳方法是什么?如何防止序列化程序关闭流?有什么方法可以检查流的内容吗?

c# stream streamwriter jsonserializer json.net

2
推荐指数
1
解决办法
756
查看次数

从.NET Core中的当前位置堆栈跟踪

如何从当前位置构造堆栈跟踪?

在.NET 4.5中使用此解决方案:

System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(true);
for (int i = 0; i < stackTrace.FrameCount; ++i)
{
    System.Diagnostics.StackFrame frame = stackTrace.GetFrame(i);
    MethodBase callerMethod = frame.GetMethod();
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是.NET Core中的解决方案是什么?构造public StackTrace(bool fNeedFileInfo)函数不再存在.

.net c# .net-core .net-standard

1
推荐指数
1
解决办法
1506
查看次数

当LINQ中的列为空时,如何用空格替换" - "

这里我在Linq查询下面有员工持续时间列.当StartDate或EndDate为null 时,如何删除" - " .只有当两者都不为空时我才想要" - ".

var query = from r in db.Employee 
            select new 
            {
                Name = r.Name,
                EmployeeDuration = r.StartDate +" - "+ r.EndDate
            }
Run Code Online (Sandbox Code Playgroud)

c# linq select string-concatenation

0
推荐指数
1
解决办法
206
查看次数