小编Vla*_*lad的帖子

null文字的类型是什么?

d所有人,我想知道nullC#中的文字类型是什么?

在Java中,null文字是特殊的null类型:

还有一个特殊的null类型,表达式的类型,null没有名称.由于null类型没有名称,因此无法声明null类型的变量或转换为null类型.空引用是null类型表达式的唯一可能值.null引用始终可以强制转换为任何引用类型.

在C++ 11中,有nullptr(老朋友的推荐版本NULL),它是类型的std::nullptr_t.

我在MSDN上搜索了C#,但规范似乎没有说明这一点.

.net c# language-lawyer

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

静态构造函数在实例构造函数之后调用?

亲爱的,这个问题已经被问过了,但在答案中,没有解释我所看到的问题.

问题:C#编程指南说:

静态构造函数用于初始化任何静态数据,或执行仅需执行一次的特定操作.在创建第一个实例或引用任何静态成员之前自动调用它.

特别是,在创建类的任何实例之前调用静态构造函数.(这不能确保静态构造函数在创建实例之前完成,但这是另一回事.)

我们来看一下示例代码:

using System;

public class Test
{
    static public Test test = new Test();
    static Test()
    {
        Console.WriteLine("static Test()");
    }
    public Test()
    {
        Console.WriteLine("new Test()");
    }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Main() started");
        Console.WriteLine("Test.test = " + Test.test);
        Console.WriteLine("Main() finished");
    }
}
Run Code Online (Sandbox Code Playgroud)

它输出:

Main()启动
新的Test()
static Test()
Test.test = Test
Main()完成

因此,我们可以看到实例构造函数在静态构造函数启动之前完成(因此创建了一个实例).这不符合指南吗?也许静态字段的初始化被认为是静态构造函数的隐式部分?

c# static constructor

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

渲染到自定义DrawingContext

我想劫持通常的WPF渲染,将控件拆分为基元,进行布局管理,为我应用绑定等.

据我所知,WPF中的整个渲染归结为在布局管理器使用依赖属性系统定义的值计算的位置处渲染基元(文本,图像,线,曲线).如果我可以提供自己的原始渲染逻辑,我将能够渲染到例如自定义文档类型,传输基元以通过网络进行实际渲染等.

我的计划如下:

  1. 实现自定义DrawingContext.该DrawingContext是一个抽象类,它定义了一堆类似的方法DrawEllipse,DrawText,DrawImage等等-我需要提供自己的实现此功能.
  2. 创建一个WPF UserControl并强制它呈现给定的DrawingContext.

但是我遇到了以下问题:

  1. DrawingContext包含抽象的内部方法void PushGuidelineY1(double coordinate)void PushGuidelineY2(double leadingCoordinate, double offsetToDrivenCoordinate),我不能轻易忽略.(也许有一些技巧可以解决这个问题?)
  2. 似乎没有方法可以渲染整个视觉效果DrawingContext?为什么?

我可以做点什么

void RenderRecursively(UIElement e, DrawingContext ctx)
{
    e.OnRender(ctx);
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(e); i++)
        RenderRecursively((UIElement)VisualTreeHelper.GetChild(e, i), ctx);
}
Run Code Online (Sandbox Code Playgroud)

- 但我想知道是否有直接的渲染方法UIElement.(当然,这个问题很小,但看不到它的基础设施让我想知道这是不是正确的方法.)

那么,DrawingContext不打算继承吗?为定制提供DrawingContext正确方向的整个想法,还是我需要重新考虑策略?是否正在绘制WPF支持的自定义上下文,或者我需要寻找不同的拦截点?

c# wpf drawingcontext

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

事件和多线程再一次

我担心看似标准的前C#6模式的正确性可以解雇事件:

EventHandler localCopy = SomeEvent;
if (localCopy != null)
    localCopy(this, args);
Run Code Online (Sandbox Code Playgroud)

我已经阅读了Eric Lippert的事件和比赛,并且知道调用过时的事件处理程序还有一个问题,但我担心的是,是否允许编译器/ JITter优化掉本地副本,有效地将代码重写为

if (SomeEvent != null)
    SomeEvent(this, args);
Run Code Online (Sandbox Code Playgroud)

有可能NullReferenceException.

根据C#语言规范,§3.10,

必须保留这些副作用的顺序的关键执行点是对volatile字段(第10.5.3节),锁语句(第8.12节)以及线程创建和终止的引用.

- 所以在上述模式中没有关键执行点,优化器也不受此限制.

Jon Skeet(2009年)的相关答案指出

由于条件的原因,JIT不允许在第一部分中执行您正在讨论的优化.我知道这是作为一个幽灵提出的,但它无效.(我刚才和Joe Duffy或Vance Morrison一起检查过;我不记得是哪一个.)

- 但是评论引用了这篇博客文章(2008年):事件和线程(第4部分),它基本上说CLR 2.0的JITter(可能是后续版本?)不能引入读取或写入,所以一定没有问题在Microsoft .NET下.但这似乎与其他.NET实现没有任何关系.

[旁注:我没有看到不引入读取证明了所述模式的正确性.难道JITter只是看到一些SomeEvent其他局部变量的陈旧值并优化其中一个读取,而不是另一个?完全合法,对吗?]

此外,这篇MSDN文章(2012年):Igor Ostrovsky的理论与实践中的C#记忆模型陈述如下:

非重新排序优化某些编译器优化可能会引入或消除某些内存操作.例如,编译器可能用一次读取替换字段的重复读取.类似地,如果代码读取字段并将值存储在局部变量中然后重复读取变量,则编译器可以选择重复读取该字段.

因为ECMA C#规范不排除非重新排序的优化,所以它们可能是允许的.实际上,正如我将在第2部分中讨论的那样,JIT编译器确实执行了这些类型的优化.

这似乎与Jon Skeet的答案相矛盾.

由于现在C#不再是Windows语言,因此问题在于,模式的有效性是否是当前CLR实现中有限的JITter优化的结果,或者是语言的预期属性.

所以,问题是:从C#-the-language的角度来看,正在讨论的模式是否有效?(这意味着是否需要语言编译器/运行时来禁止某种优化.)

当然,欢迎就该主题提出规范性参考.

.net c# multithreading memory-model language-lawyer

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

C#中延迟执行和延迟评估之间的差异

能不能让我知道C#中延迟执行和延迟评估之间的确切差异是什么?这两个是同义词使用的.可以用一个例子解释一下这个区别吗?

c# linq-to-nhibernate

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

带有标记扩展名的字符串格式

我试图string.Format在WPF中提供一个方便的功能,以便各种文本部分可以组合在纯XAML中,而不需要代码隐藏的样板.主要问题是支持函数的参数来自其他嵌套标记扩展(例如Binding)的情况.

实际上,有一个非常接近我需要的功能:MultiBinding.不幸的是,它只能接受绑定,但不能接受其他动态类型的内容,比如DynamicResources.

如果我的所有数据源都是绑定,我可以像这样使用标记:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource StringFormatConverter}">
            <Binding Path="FormatString"/>
            <Binding Path="Arg0"/>
            <Binding Path="Arg1"/>
            <!-- ... -->
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

有明显的实施StringFormatConveter.

我尝试实现自定义标记扩展,以便语法如下:

<TextBlock>
    <TextBlock.Text>
        <l:StringFormat Format="{Binding FormatString}">
            <DynamicResource ResourceKey="ARG0ID"/>
            <Binding Path="Arg1"/>
            <StaticResource ResourceKey="ARG2ID"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

或者只是

<TextBlock Text="{l:StringFormat {Binding FormatString},
                  arg0={DynamicResource ARG0ID},
                  arg1={Binding Arg2},
                  arg2='literal string', ...}"/>
Run Code Online (Sandbox Code Playgroud)

但我坚持执行,ProvideValue(IServiceProvider serviceProvider)因为参数是另一个标记扩展.

互联网上的大多数例子都是微不足道的:它们要么根本不使用serviceProvider,要么查询IProvideValueTarget,它们(大多数)说什么依赖属性是标记扩展的目标.在任何情况下,代码都知道在ProvideValue呼叫时应该提供的值.但是,ProvideValue只会调用一次(模板除外,这是一个单独的故事),因此如果实际值不是常数(如同Binding等),则应使用另一种策略.

我查找了BindingReflector中的实现,它的 …

c# wpf markup-extensions

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

SslStream,禁用会话缓存

MSDN文档说:

如果可能,框架会在创建SSL会话时对其进行缓存,并尝试将缓存会话重新用于新请求.尝试重用SSL会话时,Framework使用ClientCertificates的第一个元素(如果有),或者如果ClientCertificates为空,则尝试重用匿名会话.

如何禁用此缓存?

目前我遇到了重新连接到服务器的问题(即,第一个连接工作正常,但尝试重新连接服务器会中断会话).重新启动应用程序有帮助(但当然仅适用于第一次连接尝试).我假设问题根是缓存.

我用嗅探器检查了数据包,区别仅在于客户端Hello消息的单个位置:

第一次连接到服务器(成功):

截图

第二次连接尝试(没有程序重启,失败):

截图

差异似乎只是会话标识符.

PS我想避免使用第三方SSL客户端.有合理的解决方案吗?

这是来自ru.stackoverflow 的这个问题的翻译

c# ssl-certificate

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

矢量图像作为可重复使用的XAML片段

我想在一些WPF应用程序/库中重用一些XAML片段作为图像.

问题的背景如下:

在WPF应用程序中重用位图图像很容易.图像可以作为资源添加,我可以<Image Source="packURI"/>在XAML中的许多地方使用,因此图像将是相同的.

但是我想有可能对矢量图像做同样的事情.图像本身可以表示为Path,但我不能重复Path使用它作为资源,因为禁止在几个不同的地方(可能来自几个UI线程)使用它(UI元素只能有一个逻辑父元素).

而且,如果我想从几个Paths 构建"图像",那么问题会变得更加复杂Canvas.或者一些任意的XAML代码.

我尝试使用一StylePath,因此,图像被以这样的方式表示:

<Path Style={StaticResource VectorImage1}/>
Run Code Online (Sandbox Code Playgroud)

这似乎是一种可重用的方式,但我关注两个问题:

  1. 如果矢量图像的实现从a变为Path(例如)Canvas,我将不仅需要在样式中替换它,而且还需要在使用它的源代码中的任何地方替换它.
  2. 使用样式的路径的定义似乎太冗长.
  3. 我认为没有办法概括这种使用Canvas或任意XAML代码的方法.
  4. 语法似乎很不自然.

通过定义a UserControl,还有其他方法可以获得可重用的XAML片段,但是为每个矢量图像定义单独的用户控件似乎是一种过度杀伤力.

是否有更好,更好,正确的方法来定义可重用的XAML片段?

c# wpf resources xaml

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

传递struct as id可能吗?

我想执行一个函数,它在一个单独的线程中获取一个结构但不知道如何正确地传递结构.

有这个:

- (void) workOnSomeData:(struct MyData *)data;
Run Code Online (Sandbox Code Playgroud)

如何正确致电:

struct MyData data = ... ;
[[[NSThread alloc] initWithTarget:self selector:@selector(workOnSomeData:) object: ...
Run Code Online (Sandbox Code Playgroud)

使用&data不起作用.

struct objective-c

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

WPF标签中的自动换行符

WPF是否可以Label自动拆分为多行?在下面的示例中,文本在右侧裁剪.

<Window x:Class="..." xmlns="..." xmlns:x="..." Height="300" Width="300">
    <Grid>
        <Label>
            `_Twas brillig, and the slithy toves did gyre and gimble in the wabe:
            all mimsy were the borogoves, and the mome raths outgrabe.
        </Label>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

遗憾的是,采取其他控制措施不是一个好选择,因为我需要支持访问密钥.

替换Labela TextBlock(有TextWrapping="Wrap"),并调整其控制模板以识别访问密钥可能是一个解决方案,但它不是一个矫枉过正吗?

编辑:标签的非标准样式会破坏皮肤,所以我想尽可能避免它.

.net wpf line-breaks wpf-controls

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