我一直认为这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()调用是有用/有害还是在编译器优化代码后没有区别?
根据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时已经完成的解析?
说问题很难,我希望下面的代码片段能说清楚:
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?
以下代码是线程安全的吗?
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)?
我正在使用自定义 JsonConverter 并JsonSerializerSettings.TypeNameHandling = TypeNameHandling.Objects在反序列化期间创建所需的实例。这些实例是通过解析 Autofac IOC 容器中的类型来创建的。一切都很好,除了......
我有几个“核心对象”,它们在服务的构造函数中请求唯一的 ID(已正确注入到构造函数中)。反序列化时不应发生这种情况,因为它相当昂贵,并且一旦创建实例,ID 就会从 Json 文件填充。
目前,当从自定义 JsonConverter 中解析时,我使用_scope.Resolve<T>(new TypedParameter(typeof(IIdService), null));- 在被调用的构造函数中 - 检查 null 并采取相应的行动。
有些人显然认为使用 IOC 时多个构造函数比代码味道更糟糕(这让我想知道为什么 Autofac 提供了与该主题相关的多个功能),但在反序列化的背景下,我认为它非常有意义。
据我所知,Autofac 有机制来决定在注册期间使用哪个构造函数,但在解析时则不然。我的首选解决方案是将自定义属性添加到构造函数(例如[CtorForDeserializing])并使用它来做出决定。那可能吗?
这是我的帖子的后续内容,这是并发可观察集合的正确实现吗?。
在那篇文章中,我有一个自定义类,它实现了通用并发可观察列表,包括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调用之前刷新)?而且,这个“副作用”是编译器不优化代码的原因吗——因为优化是“无副作用”的?
考虑以下类和接口:
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>.
我使用的是 Visual Studio 2017、.NET 4.6.2、C# 6.0 和 Newtonsoft.Json 11.0.2。
我尝试加载符号,以便可以单步执行代码,但以下方法都不起作用:
任何人都可以提供分步教程来解释如何集成符号,以便我可以逐步执行代码吗?
我问谷歌上面的问题,并被发送到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?
如何将数值(例如,,,...)转换float为short多个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。