我想用两种方法创建一个类:
void SetValue(T value) 存储一个值,但只允许存储单个值(否则会抛出异常).T GetValue() 检索值(如果还没有值,则抛出异常).我有以下愿望/约束:
GetValue()只有在最新值不存在时才抛出异常(null):null在调用SetValue()另一个线程后,它不应该基于陈旧值抛出异常.GetValue()如果值不为null,则表示不需要刷新值.我提出了几种实现这一目标的方法,但我不确定哪些是正确的,哪些是有效的,为什么它们(正确)和(有效),以及是否有更好的方法来实现我想要的东西.
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) Visual Studio有一个"错误列表"窗口:

在msbuild任务中(在.csproj文件中):
<error text="Foo">标签时,我在错误列表中出现错误(我可以通过在该窗口中取消切换错误来隐藏它)<warning text="Bar">标签时,我在错误列表中收到警告(我可以通过在该窗口中取消切换警告来隐藏它)<message text="Baz">标签时,我在错误列表窗口中看不到任何内容.如果我进入输出窗口,我可以在那里看到消息(即使我打开或关闭消息).我如何从MSBuild脚本生成显示在Visual Studio"错误列表"窗口中的消息?
注意:我正在使用Visual Studio 2010.
在WPF中,当我ProgressBar在XAML文件中放入时,默认情况下其高度约为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# 是否与 Java 的<X super MySubClass>泛型约束等效。
要指定上限,可以使用class Foo<T> where T : MySuperClass { ... },但我们如何指定泛型参数的下限?
有一些方法可以获得类似的结果,但我还没有找到完美的东西:
使用第二个泛型参数——但调用者可以指定实际下限的子类。
public class Foo<T, TLowerBound>
where TLowerBound : MySubClass
where TLowerBound : T
{
...
}
Run Code Online (Sandbox Code Playgroud)这有时用于扩展方法,因此扩展方法的参数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)在接口上使用方差,但我不确定这是否可用于指定泛型参数的下限。
如何ignore-space-change使用设置所有合并的选项git config?
我也许可以用在一个别名merge,但因为我想要的设置适用于git stash pop,git stash apply,git pull和git merge,和其他人如果有的话,我想不是建立许多别名一个更清洁的方式(我甚至不知道我是否可以成立stash子命令的别名)。
我看了看文档,但是找不到要使用的配置选项。
在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.Parameter和System.AttributeTargets.ReturnValue。
如何调用我在另一个 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)
另外,如果不首先创建包含静态方法的(可能是静态的)类的实例,我将如何调用静态方法?
我试图在终端中运行的应用程序中以像素为单位获取鼠标的位置。
xdotool将不会在这种情况下工作,除非ssh -X使用)。目标是在大多数基于文本的应用程序中嵌入小的 GUI 元素。目前在很多使用 Sixel、Tektronix 或 ReGIS 的终端模拟器上都可以绘制东西,\e[1000h或者类似的转义码来获取鼠标事件,不幸的是,这些鼠标事件是低分辨率的(字符单元格中的坐标,而不是像素)。
我尝试使用 构建一个 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) 调用后检查溢出的正确方法是什么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。没有抛出异常。
我经常发现自己提交的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自动包含这些文件.
在 CIL 中,缺少virtual关于继承(隐藏和覆盖)标志的虚方法的行为是什么?我搜索了ECMA335,但找不到预期行为的确切描述。
例如,让我们有基类A和子类B。
A包含一个M带有 flag的方法virtual,并且B包含一个M没有 flag的方法virtual,是B.M隐藏A.M还是覆盖它?A包含一个M带有标志的方法virtual,并且B包含一个M带有.override A.M标志但没有标志的方法virtual,则是virtual隐含的,B.M仅在此处是“虚拟的”(但是,例如,B.M不能在 的子类中被覆盖B)或者这种构造是否只是非法的(即方法.override 必须有virtual标志)?我想知道规范的哪一部分回答了这些问题,所以我将来可以自己回答类似的问题(在问这里之前我确实搜索了很多)。
c# ×7
.net ×2
generics ×2
git ×2
interlocked ×2
annotations ×1
ansi-escape ×1
appdomain ×1
cil ×1
git-config ×1
git-merge ×1
gitignore ×1
java ×1
lock-free ×1
lower-bound ×1
merge ×1
messages ×1
msbuild ×1
offset ×1
progress-bar ×1
remoting ×1
struct ×1
volatile ×1
wpf ×1