小编Suz*_*ron的帖子

从Interlocked变量中读取最新值,只对变量进行一次写入

我想用两种方法创建一个类:

  • void SetValue(T value) 存储一个值,但只允许存储单个值(否则会抛出异常).
  • T GetValue() 检索值(如果还没有值,则抛出异常).

我有以下愿望/约束:

  • 读取价值应该便宜.
  • 写入价值可能(适度)成本高昂.
  • GetValue()只有在最新值不存在时才抛出异常(null):null在调用SetValue()另一个线程后,它不应该基于陈旧值抛出异常.
  • 该值仅写入一次.GetValue()如果值不为null,则表示不需要刷新值.
  • 如果可以避免完全的内存屏障,那么(更好).
  • 我得到的无锁并发性更好,但我不确定这是否是这种情况.

我提出了几种实现这一目标的方法,但我不确定哪些是正确的,哪些是有效的,为什么它们(正确)和(有效),以及是否有更好的方法来实现我想要的东西.

方法1

  • 使用非易失性字段
  • 使用Interlocked.CompareExchange写入场
  • 使用Interlocked.CompareExchange从外地来读
  • 这依赖于(可能是错误的)假设,即在Interlocked.CompareExchange(ref v, null, null)对字段执行操作后将导致下一次访问获得的值至少与Interlocked.CompareExchange看到的值相同.

代码:

public class SetOnce1<T> where T : class
{
    private T _value = null;

    public T GetValue() {
        if (_value == null) {
            // Maybe we got a stale value (from the cache or compiler optimization).
            // Read an …
Run Code Online (Sandbox Code Playgroud)

c# volatile interlocked lock-free

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

MSBuild:生成在VisualStudio的"错误列表"窗口中可见的消息

Visual Studio有一个"错误列表"窗口:

Visual Studio错误列表窗口

在msbuild任务中(在.csproj文件中):

  • 当我使用<error text="Foo">标签时,我在错误列表中出现错误(我可以通过在该窗口中取消切换错误来隐藏它)
  • 当我使用<warning text="Bar">标签时,我在错误列表中收到警告(我可以通过在该窗口中取消切换警告来隐藏它)
  • 当我使用<message text="Baz">标签时,我在错误列表窗口中看不到任何内容.如果我进入输出窗口,我可以在那里看到消息(即使我打开或关闭消息).

我如何从MSBuild脚本生成显示在Visual Studio"错误列表"窗口中的消息?

注意:我正在使用Visual Studio 2010.

msbuild messages visual-studio-2010

6
推荐指数
0
解决办法
1060
查看次数

C#WPF ProgressBar"默认"高度

在WPF中,当我ProgressBarXAML文件中放入时,默认情况下其高度约为2或3个像素.

微小的进度条.

我应该与其他Windows应用程序保持一致的高度(并根据dpi分辨率调整高度等)?我尝试过设置,Height="auto"但结果是一样的.

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel Name="dockPanel1">
        <ProgressBar Name="progressBar1" Value="33" DockPanel.Dock="Top"/>
        <TreeView Name="treeView1" />
    </DockPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)

c# wpf progress-bar

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

C# 泛型下限约束“where MySubClass : T”(java 的“super”)

我想知道 C# 是否与 Java 的<X super MySubClass>泛型约束等效。

要指定上限,可以使用class Foo<T> where T : MySuperClass { ... },但我们如何指定泛型参数的下限?


有一些方法可以获得类似的结果,但我还没有找到完美的东西:

  1. 使用第二个泛型参数——但调用者可以指定实际下限的子类。

    public class Foo<T, TLowerBound>
        where TLowerBound : MySubClass
        where TLowerBound : T
    {
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这有时用于扩展方法,因此扩展方法的参数U被限制为类参数的超类T

    public static class Extensions {
        public static void Method<T, U>(this Foo<T> self, U someU) where T : U {
            self.ValueOfTypeT = someU;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在接口上使用方差,但我不确定这是否可用于指定泛型参数的下限。

c# java generics lower-bound

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

git merge -Xignore-space-change默认情况下

如何ignore-space-change使用设置所有合并的选项git config

我也许可以用在一个别名merge,但因为我想要的设置适用于git stash popgit stash applygit pullgit merge,和其他人如果有的话,我想不是建立许多别名一个更清洁的方式(我甚至不知道我是否可以成立stash子命令的别名)。

我看了看文档,但是找不到要使用的配置选项。

git merge git-merge git-config

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

C#中的System.AttributeTargets.GenericParameter:如何使用这样的属性?

在C#中,当指定应如何使用属性类GenericParameter时,System.AttributeTargets枚举中有一个值。我们如何应用这样的属性,其语法是什么?

[System.AttributeUsage(System.AttributeTargets
public sealed class MyAnnotationAttribute : System.Attribute {
    public string Param { get; private set; }
    public MyAnnotationAttribute(string param) { Param = param; }
}
Run Code Online (Sandbox Code Playgroud)

其他奇特的属性目标也有同样的问题,例如System.AttributeTargets.Module(我什至不知道如何声明除主模块之外的模块?)System.AttributeTargets.ParameterSystem.AttributeTargets.ReturnValue

c# generics annotations

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

如何调用另一个AppDomain中的方法

如何调用我在另一个 AppDomain 中创建的对象的方法?我想避免使用CreateInstanceFromAndUnwrap,因为这需要我引用我想要操作的 DLL。

public static void Main() {
    // Create domain
    AppDomain domain = AppDomain.CreateDomain("Foo");

    // Load assembly
    domain.Load("C:\\Foo.dll");

    // Create instance of class
    System.Runtime.Remoting.ObjectHandle inst
        = domain.CreateInstance("C:\\Foo.dll", "MyNamespace.MyClass");

    // Call method -- How can I do this ???
    object result = inst.PleaseCallMethod("MyMethod", "param1", 42, "p3", null);
}
Run Code Online (Sandbox Code Playgroud)

我会Foo.dll

namespace MyNamespace {
    public class MyClass {
        public string MyMethod(string p1, int p2, string p3, string p4) {
            return "...";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,如果不首先创建包含静态方法的(可能是静态的)类的实例,我将如何调用静态方法?

c# remoting appdomain

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

使用转义序列以像素为单位获取鼠标位置

我试图在终端中运行的应用程序中以像素为单位获取鼠标的位置。

  • 顶端回答如何得到的MouseMove和鼠标点击在bash?解释了如何获得鼠标位置,以字符单元数计算,而不是以像素为单位。
  • 我正在寻找一个解决方案,如果应用程序在远程服务器上运行,并通过SSH访问(使用也可以工作xdotool不会在这种情况下工作,除非ssh -X使用)。
  • 我想解决方案因此将涉及转义序列或 IOCTL。
  • 如果转义序列仅适用于一个或几个终端模拟器(我可以使用检测机制在不支持转义序列的终端上提供回退),那也没关系。
  • 如果转义序列仅适用于少数终端仿真器,我也很想知道允许在这些终端(例如 Sixel、Tektronix 或 ReGIS)上进行图形输出的转义序列“组”。

目标是在大多数基于文本的应用程序中嵌入小的 GUI 元素。目前在很多使用 Sixel、Tektronix 或 ReGIS 的终端模拟器上都可以绘制东西,\e[1000h或者类似的转义码来获取鼠标事件,不幸的是,这些鼠标事件是低分辨率的(字符单元格中的坐标,而不是像素)。

user-interface ansi-escape terminal-emulator

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

LayoutKind.explicit 对于本身是结构的字段的 .NET 行为

我尝试使用 构建一个 struct ( SA) [StructLayout(LayoutKind.Explicit)],它有一个字段是另一个struct( SB)。

首先:我很惊讶我被允许声明其他结构没有[StructLayout(LayoutKind.Explicit)],而在SA,所有字段都必须[FieldOffset(0)],否则编译器会大喊大叫。这没有多大意义。

  • 这是编译器警告/错误中的漏洞吗?

第二:似乎所有的 reference( object) 字段SB都移到了SB.

  • 这种行为在任何地方都有描述吗?
  • 它依赖于实现吗?
  • 它是否在任何依赖于实现的地方定义? :)

注意:我不打算在生产代码中使用它。我问这个问题主要是出于好奇。

实验

// No object fields in SB
// Gives the following layout (deduced from experimentation with the C# debugger):

// | f0 | f4 and i | f8 and j | f12 and k | f16 |

[StructLayout(LayoutKind.Explicit)]
struct SA …
Run Code Online (Sandbox Code Playgroud)

.net c# struct offset layoutkind.explicit

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

如何在 C# 中检查 Interlocked.Increment 后是否溢出?

调用后检查溢出的正确方法是什么Interlocked.Increment

我有一个 ID 生成器,可以在程序执行期间生成唯一的 ID,目前我测试增量是否返回零。

public static class IdGenerator {
    private static int _counter = 0;
    
    public static uint GetNewId() {
        uint newId = (uint)System.Threading.Interlocked.Increment(ref _counter);
        if (newId == 0) {
             throw new System.Exception("Whoops, ran out of identifiers");
        }
        return newId;
    }
}
Run Code Online (Sandbox Code Playgroud)

鉴于我每次运行生成的 ID 数量相当大,(在异常大的输入上)_counter增量时可能会溢出,并且我想在这种情况下抛出异常(尽早崩溃以简化调试)。

摘自微软的文档

location此方法通过包装: if = Int32.MaxValue, location + 1=来处理溢出情况Int32.MinValue。没有抛出异常。

c# integer-overflow interlocked interlocked-increment

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

忽略将来使用git add -f添加的.gitignore文件的修改

我经常发现自己提交的git add -f是.gitignore(.exe,, .pdf...)中的二进制文件,只是为了在历史记录中包含一个稳定的,可正常工作的编译文件,所以即使我在编译它时遇到问题我也至少可以使用它(例如,因为另一台计算机上缺少库).

$ cat .gitignore
*.exe
*.pdf
$ git add -f program.exe documentation.pdf
$ git commit -m "Added working .exe and .pdf"
$ gcc program.c -o program.exe
$ pdflatex documentation.tex # Generates documentation.pdf
$ git status --short
 M program.exe
 M documentation.pdf
Run Code Online (Sandbox Code Playgroud)

现在我已经添加了.exe.pdf,我希望将来可以忽略对它们的修改.否则,每次我git commit -a自动包含这些文件.

git gitignore

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

CIL中非虚方法的继承行为

在 CIL 中,缺少virtual关于继承(隐藏和覆盖)标志的虚方法的行为是什么?我搜索了ECMA335,但找不到预期行为的确切描述。

例如,让我们有基类A和子类B

  1. 如果A包含一个M带有 flag的方法virtual,并且B包含一个M没有 flag的方法virtual,是B.M隐藏A.M还是覆盖它?
  2. 如果A包含一个M带有标志的方法virtual,并且B包含一个M带有.override A.M标志但没有标志的方法virtual,则是virtual隐含的,B.M仅在此处是“虚拟的”(但是,例如,B.M不能在 的子类中被覆盖B)或者这种构造是否只是非法的(即方法.override 必须virtual标志)?

我想知道规范的哪一部分回答了这些问题,所以我将来可以自己回答类似的问题(在问这里之前我确实搜索了很多)。

.net cil

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