我应该选择哪种方法?为什么?有什么真正的区别吗?
抽象属性:
abstract class Table
{
public abstract string Title { get; }
}
class InfoTable : Table
{
public override string Title
{
get { return "Info"; }
}
}
Run Code Online (Sandbox Code Playgroud)
或基类构造函数参数:
abstract class Table
{
public string Title { get; private set; }
public Table(string title)
{
Title = title;
}
}
class InfoTable : Table
{
public InfoTable() : base("Info") { }
}
Run Code Online (Sandbox Code Playgroud) 首先,我遇到了这个构建错误,但只在某些机器上:
错误CS1705汇编'***',标识'***,版本= 1.0.0.0,Culture =中性,PublicKeyToken = null'使用'System.Net.Http,Version = 4.1.1.1,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a '它的版本高于引用的程序集'System.Net.Http',标识为'System.Net.Http,Version = 4.1.1.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'***C:\***\CSC 1有效
我想,它与SDK版本有某种联系.从我在"属性"窗口中可以看到的,在我拥有的一些项目上,Microsoft.NETCore.App 1.1.1而在其他项目中Microsoft.NETCore.App 1.1.2.
包更新后,构建成功(但为什么我被迫更新所有包?).
但是,sdk版本仍然不同.现在我正在尝试使用Visual Studio的这个整合功能:
在工具提示中说:
由于项目或packages.config中的其他约束,以下版本是不可用的
如何将所有项目升级到更新的SDK?如何确保未来不打破其他机器的构建?
我有很多来自Visual Studio Image Library的 XAML 文件。这是其中之一的内容 - Add_16xMD.xaml
<!-- This file was generated by the AiToXaml tool.-->
<!-- Tool Version: 14.0.22307.0 -->
<Viewbox Width="16" Height="16" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Rectangle Width="16" Height="16">
<Rectangle.Fill>
<DrawingBrush>
<DrawingBrush.Drawing>
<DrawingGroup>
<DrawingGroup.Children>
<GeometryDrawing Brush="#00FFFFFF" Geometry="F1M16,16L0,16 0,0 16,0z" />
<GeometryDrawing Brush="#FFF6F6F6" Geometry="F1M10,7L14,7 14,10 10,10 10,14 7,14 7,10 3,10 3,7 7,7 7,3 10,3z" />
<GeometryDrawing Brush="#FF388A34" Geometry="F1M13,8L9,8 9,4 8,4 8,8 4,8 4,9 8,9 8,13 9,13 9,9 13,9z" />
</DrawingGroup.Children>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</Rectangle.Fill>
</Rectangle>
</Viewbox>
Run Code Online (Sandbox Code Playgroud)
我想将其包含到我的 WPF 项目中并在我的应用程序中使用。我不想复制粘贴代码,也不想修改这些用 …
我Task必须工作很长时间(就像服务一样) - 所以我需要做到LongRunning.
同时,我需要将其标记为AttachedToParent在服务任务完成之前阻止父任务完成.
如何结合这两个任务创建选项?
我很惊讶地看到,我得到了对象的实际类型x.GetType().GetProperty("Foo")是不是System.Reflection.PropertyInfo,但System.Reflection.RuntimePropertyInfo.
我没有在msdn或其他地方看到这种类型的文档.
我的实际问题从参考 - 比较两个属性增长.我从第三方库中收到一个属性,并将其与我.GetProperty("Foo")在相同类型上获得的属性进行比较.我希望属性是同一个对象(在调试时它们看起来像"Locals"窗口中的相同属性),但它们不是(GetHashCode结果不同).所以,我认为它可以某种方式与属性对象的实际类型相关System.Reflection.RuntimePropertyInfo.
什么是System.Reflection.RuntimePropertyInfo?怎么比较呢?它和往常一样PropertyInfo吗?
我已经创建了新的.NET Core控制台应用程序,但无法找到字符串实习方法.
这是一个旧的文档:https://msdn.microsoft.com/en-us/library/system.string.intern(v= vs.110) .aspx
一个辛苦的工作日我注意到我用通常的.NET 方法生成的GUID在第三个块的开头Guid.NewGuid()有相同的数字4:
efeafa5f-fe21-4ab4-ba82-b9eefd5fa225
480b64d0-6762-4afe-8496-ac7cf3292898
397579c2-a4f4-4611-9fda-16e9c1e52d6a
...
Run Code Online (Sandbox Code Playgroud)
屏幕上每隔一秒出现一次.在第五个GUID之后,我一直关注这个模式.最后,最后一个内部有相同的四位,我认为我是一个幸运的人.我回到家,觉得整个世界都为我这样一个特殊的人开放.下周我找到了一份新作品,打扫了我的房间并打电话给我的父母.
但今天我又面临同样的模式.千倍.我不再感受到选择的了.
我用谷歌搜索了它,现在我知道了UUID和一个规范格式,有4个保留位version和2个用于variant.
这是一个试验片段:
static void Main(string[] args)
{
while (true)
{
var g = Guid.NewGuid();
Console.WriteLine(BitConverter.ToString(g.ToByteArray()));
Console.WriteLine(g.ToString());
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
但仍然有一件事我不明白(除了如何继续生活).为什么我们需要这些保留位?我看到它会如何伤害 - 暴露内部实施细节,更多碰撞(仍然无需担心,但有一天......),更多的自杀 - 但我没有看到任何好处.你能帮我找到吗?

我想知道,为什么Microsoft开发人员不向我们提供各种不可靠方法的"尝试"版本?
如果我使用数据库连接或smtp客户端,我总是必须考虑例外:
try
{
smtpClient.Send(message);
}
catch (SmtpException)
{
// test with real smtp server and analyze an exception and it's contents here
}
Run Code Online (Sandbox Code Playgroud)
但我想要的用户是:
if(!smtpClient.TrySend(message, out reason))
{
// analyze reason here
}
Run Code Online (Sandbox Code Playgroud)
对我来说最大的问题是异常性能开销.我无法承担在我的服务的每个客户电话上抛出异常.如果我需要检查几十个连接/提供者,这可能会导致每个客户端请求有几十个例外.
我的问题是:.NET中这种API设计决策的基本原理是什么?我不认为这是一个错误,因为它无处不在,而不是单一的技术.
更新
我必须再给你一个.NET异常的例子来停止谈论网络延迟.例如,如果停止了Windows服务,则System.Diagnostics.EventLog.WriteEntry可以抛出方法System.ComponentModel.Win32Exception.
我确定之前我看到过这个方法,因为一年前我问过:KeyValuePair<> struct 中的 Deconstruct 方法的目的是什么?
但现在我根本找不到它,或者任何关于它被移除的痕迹,任何问题,什么都没有。
编译器同意:
var s = new KeyValuePair<int, int>(1, 3);
var (x, y) = s;
Run Code Online (Sandbox Code Playgroud)
错误 CS1061“KeyValuePair”不包含“Deconstruct”的定义,并且找不到接受“KeyValuePair”类型的第一个参数的可访问扩展方法“Deconstruct”(您是否缺少 using 指令或程序集引用?
错误 CS8129 找不到适合类型“KeyValuePair”的“解构”实例或扩展方法,具有 2 个输出参数和一个 void 返回类型。
这是怎么回事?
公告告诉我们:
程序集卸载能力是 AssemblyLoadContext 的一项新功能。从 API 的角度来看,这项新功能在很大程度上是透明的,仅通过几个新 API 公开。它允许卸载加载器上下文,释放实例化类型、静态字段和程序集本身的所有内存。应用程序应该能够通过这种机制永远加载和卸载程序集而不会出现内存泄漏。
此外,这个设计说明提到了“静态”。
我试过这个简单的测试:
static void Main()
{
Proxy.X = 15;
var alc = new AssemblyLoadContext("MyTest", true);
var asm = alc.LoadFromAssemblyName(typeof(Program).Assembly.GetName());
var proxy = (Proxy)asm.CreateInstance(typeof(Proxy).FullName);
Console.WriteLine(proxy.Increment());
}
class Proxy
{
public static int X;
public int Increment() => ++X;
}
Run Code Online (Sandbox Code Playgroud)
它输出“16”,这意味着隔离不起作用。
我的目标是对可以抛出异常的类静态成员进行单元测试。通常的测试可以通过触发类型初始值设定项来影响彼此的行为,因此我需要以尽可能便宜的方式隔离它们。测试应在 .NET Core 3.0 上运行。
这样做是否正确,并且可以提供AssemblyLoadContext帮助?