小编mik*_*ike的帖子

DirectCast具有性​​能和延迟/早期绑定有什么影响?

我一直认为这DirectCast()是相当便宜,性能和内存方面的,并且它基本上是一种帮助我使用IntelliSense的方法,例如在事件处理程序中:

Public Sub myObject_EventHandler(sender As Object, e As System.EventArgs)
    'Explicit casting with DirectCast
    Dim myObject As myClass = DirectCast(sender, myClass)

    myObject.MyProperty = "myValue"
End Sub
Run Code Online (Sandbox Code Playgroud)

我认为这对于我作为开发人员来说更好,但对于编译的代码和最终的性能也是如此,因为它启用了"早期绑定"而不是...

Public Sub myObject_EventHandler(sender As Object, e As System.EventArgs)
    'No casting at all (late binding)
    myObject.MyProperty = "myValue"
End Sub
Run Code Online (Sandbox Code Playgroud)

...如果我正确地得到了这些术语,它也可以编译和运行,但使用"后期绑定".即假设它sender实际上是一个myClass对象.

关于性能,延迟/早期绑定或其他任何事情,上面的第一个片段和下面的片段之间有什么区别:

Public Sub myObject_EventHandler(sender As Object, e As System.EventArgs)
    'Implicit casting via variable declaration
    Dim myObject As myClass = sender

    myObject.MyProperty = "myValue"
End Sub
Run Code Online (Sandbox Code Playgroud)

显式DirectCast()调用是有用/有害还是在编译器优化代码后没有区别?

vb.net performance directcast

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

如何从JToken填充现有对象(使用Newtonsoft.Json)?

根据http://www.newtonsoft.com/json/help/html/PopulateObject.htm,您可以按JSON字符串中定义的值更新现有实例.我的问题是我必须填充对象的数据已经被解析为JToken对象.我目前的方法看起来像这样:

Private Sub updateTarget(value As JToken, target as DemoClass)
    Dim json As String = value.ToString(Formatting.None) 
    JsonConvert.PopulateObject(json, target)
End Sub
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这一点,而不必"恢复"在创建JToken时已经完成的解析?

c# vb.net json

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

为什么使用继承类型没有检测到泛型类的类约束?

说问题很难,我希望下面的代码片段能说清楚:

public class DemoClass<TBase> where TBase : class
{
    public void DemoMethod<T>(T target) where T : TBase
    {
        //The following line causes a design-time error: Type argument 'T' does not satisfy the 'Class' constraint for type parameter 'T'.
        WeakReference<T> demoRef = new WeakReference<T>(target);
    }
}
Run Code Online (Sandbox Code Playgroud)

WeakReference需要一个类型,T即满足class约束.到目前为止,这么好,但......

为什么编译器无法检测到T实际发生的情况,因为(实际上)T : TBase : class

c# generics inheritance

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

C#中的`is`运算符是线程安全的/原子的吗?

以下代码是线程安全的吗?

public object DemoObject {get;set;}

public void DemoMethod()
{
    if (DemoObject is IDemoInterface demo)
    {
        demo.DoSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果其他线程在处理时修改DemoObject(例如设置为空)DemoMethod,是否保证在if块内局部变量demo总是被正确分配(给类型的实例IDemoInterface)?

c# multithreading atomicity

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

如何确定 Autofac 在解析时使用哪个构造函数

我正在使用自定义 JsonConverter 并JsonSerializerSettings.TypeNameHandling = TypeNameHandling.Objects在反序列化期间创建所需的实例。这些实例是通过解析 Autofac IOC 容器中的类型来创建的。一切都很好,除了......

我有几个“核心对象”,它们在服务的构造函数中请求唯一的 ID(已正确注入到构造函数中)。反序列化时不应发生这种情况,因为它相当昂贵,并且一旦创建实例,ID 就会从 Json 文件填充。

目前,当从自定义 JsonConverter 中解析时,我使用_scope.Resolve<T>(new TypedParameter(typeof(IIdService), null));- 在被调用的构造函数中 - 检查 null 并采取相应的行动。

有些人显然认为使用 IOC 时多个构造函数比代码味道更糟糕(这让我想知道为什么 Autofac 提供了与该主题相关的多个功能),但在反序列化的背景下,我认为它非常有意义。

据我所知,Autofac 有机制来决定在注册期间使用哪个构造函数,但在解析时则不然。我的首选解决方案是将自定义属性添加到构造函数(例如[CtorForDeserializing])并使用它来做出决定。那可能吗?

c# autofac json.net deserialization

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

C#编译器会优化变量吗?

这是我的帖子的后续内容,这是并发可观察集合的正确实现吗?

在那篇文章中,我有一个自定义类,它实现了通用并发可观察列表,包括IEnumerable<T>.GetEnumerator(). 这是原来的代码:

public IEnumerator<T> GetEnumerator()
{
    var localSnapshot = _snapshot; //create local variable to protect enumerator, if class member (_snapshot) should be changed/replaced while iterating
    return ((IEnumerable<T>)localSnapshot).GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)

作为_snapshot私有字段,每当修改实际内部集合 ( ) 时Array,都会使用 a 重建。lock()List<T> _list

但现在我认为该localSnapshot变量根本不需要,代码应该是:

public IEnumerator<T> GetEnumerator()
{
    return ((IEnumerable<T>)_snapshot).GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)

因为localSnapshot只是将引用分配给所_snapshot引用的同一地址。GetEnumerator不关心(也不能告诉)使用了哪个变量(当然,为了自己的使用,会创建另一个引用同一数组的变量)。

如果我的上述假设是正确的,我想知道编译器是否会优化该变量?那么生成的代码将是相同的。或者,如果不是:理论上复制引用是否可能是“有害的”,因为副本的最新程度会低于其应有的水平(另一个线程可以在_snapshot复制完成后但在GetEnumerator调用之前刷新)?而且,这个“副作用”是编译器不优化代码的原因吗——因为优化是“无副作用”的?

c# multithreading compiler-optimization

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

Autofac:类型“...”不可分配给服务“...”。

考虑以下类和接口:

interface IFactory<T>{}
class Factory<T> : IFactory<T>{ }

interface IEntity{}
class Entity : IEntity{ }
Run Code Online (Sandbox Code Playgroud)

我希望 Autofac 能够解决这样的IFactory<IEntity>问题Factory<Entity>

b.RegisterType<Factory<Entity>>().As<IFactory<IEntity>>();
Run Code Online (Sandbox Code Playgroud)

但我得到以下异常(为了清楚起见缩写):

The type 'Factory`1[Entity]' is not assignable to service 'IFactory`1[[IEntity]]'
Run Code Online (Sandbox Code Playgroud)

这是为什么?如何解决这个问题?或者我正在尝试一些“错误”的事情?

我简单地研究了一下RegisterGeneric,但我认为它不适用于这里;另外,因为上面只是一个例子。在其他情况下,我可能想为IFactory<IEntity>.

c# generics autofac

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

如何加载 Newtonsoft.Json 符号

我使用的是 Visual Studio 2017、.NET 4.6.2、C# 6.0 和 Newtonsoft.Json 11.0.2。

我尝试加载符号,以便可以单步执行代码,但以下方法都不起作用:

  • 我尝试添加“ https://nuget.smbsrc.net ”(带或不带尾部斜杠)作为符号服务器,但 VS 说它在那里找不到任何符号。
  • 我下载了整个 Newtonsoft.Json 代码,构建了解决方案(在必须卸载 Newtonsoft.Json.Tests 和 Newtonsoft.Json.TestConsole 项目之后,因为我无法消除错误)并尝试将 VS 定向到 . pdb 文件位于 ...Newtonsoft.Json-master\Src\Newtonsoft.Json\bin\Debug\net45 中,但 VS 也不会接受。

任何人都可以提供分步教程来解释如何集成符号,以便我可以逐步执行代码吗?

c# visual-studio visual-studio-debugging

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

什么是“准实施”?

有时,在搜索会员的推荐信时,我会收到此弹出窗口,这通常需要很长时间,所以我倾向于取消。但我想知道:我错过了什么?什么是“准实施”?

在此输入图像描述

c# resharper

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

UTF-16与UTF-8兼容吗?

我问谷歌上面的问题,并被发送到UTF-8和UTF-16之间的差异?遗憾的是,这个问题没有回答.

根据我的理解,UTF-8应该是UTF-16的一个子集,意思是:如果我的代码使用UTF-16并且我输入UTF-8编码的字符串,那么一切都应该没问题.反过来(期望UTF-8和获得UTF-16)可能会导致问题.

那是对的吗?

编辑:澄清为什么链接的SO问题不回答我的问题:我的问题是在尝试使用时处理JSON字符串时出现的WebClient.DownloadString,因为WebClient使用了错误的编码.我从请求中收到的JSON编码为UTF-8,对我来说问题是:如果我设置webClient.Encoding = New System.Text.UnicodeEncoding(又名UTF-16)我会安全,即能够处理UTF-8和UTF-16请求结果,还是应该使用webClient.Encoding = New System.Text.UTF8Encoding

encoding utf-8 utf-16

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

在 C# 中将数字转换为字节而不分配

如何将数值(例如,,,...)转换floatshort多个int值,byte而不必像那样在堆上为数组分配内存System.BitConverter.GetBytes

像这样的东西:

public static void GetBytes(short input, out byte byte0, out byte byte1)
{
    //demo code, just to show which results I need
    var bytes = System.BitConverter.GetBytes(input);
    byte0 = bytes[0];
    byte1 = bytes[1];
}
Run Code Online (Sandbox Code Playgroud)

注意:我仅限于 .NET Framework 4.8,因此(我认为)C# 7.3。

c# arrays math garbage-collection

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