几天前,我回答了一个关于SO 的有趣问题HashSet<T>.一个可能的解决方案涉及克隆hashset,在我的回答中我建议做这样的事情:
HashSet<int> original = ...
HashSet<int> clone = new HashSet<int>(original);
Run Code Online (Sandbox Code Playgroud)
虽然这种方法非常简单,但我怀疑它的效率非常低:新构造函数HashSet<T>需要单独添加原始hashset中的每个项目,并检查它是否已经存在.这显然是浪费时间:因为源集合是a ISet<T>,所以保证不包含重复项.应该有办法利用这些知识......
理想情况下,HashSet<T>应该实施ICloneable,但遗憾的是并非如此.我还检查了Reflector,看看如果HashSet<T>源集合是一个哈希集,构造函数是否做了特定的事情,但事实并非如此.它可能可以通过在私有字段上使用反射来完成,但这将是一个丑陋的黑客......
那么,有人提出了一个更有效地克隆哈希集的聪明解决方案吗?
(请注意,这个问题纯粹是理论上的,我不需要在真实的程序中这样做)
好吧,我意识到这个问题可能看起来很奇怪,但我只是注意到了一些令我困惑的事情......看看这段代码:
static void TestGC()
{
object o1 = new Object();
object o2 = new Object();
WeakReference w1 = new WeakReference(o1);
WeakReference w2 = new WeakReference(o2);
GC.Collect();
Console.WriteLine("o1 is alive: {0}", w1.IsAlive);
Console.WriteLine("o2 is alive: {0}", w2.IsAlive);
}
Run Code Online (Sandbox Code Playgroud)
由于o1和o2仍然在范围时,垃圾回收时,我本来期望的输出如下:
o1还活着:真正的
o2还活着:真的
但相反,这就是我得到的:
o1还活着:假
o2还活着:假
注意:仅当代码在发布模式下编译并在调试器外部运行时才会发生这种情况
我的猜测是GC检测到它o1并且o2在它们超出范围之前不会再次使用,并尽早收集它们.为了验证这个假设,我在TestGC方法的最后添加了以下行:
string s = o2.ToString();
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
o1还活着:假
o2还活着:是的
所以在这种情况下,o2不收集.
有人能说清楚发生了什么吗?这与JIT优化有关吗?到底发生了什么?
我在C#WPF应用程序中有一个图像,其构建操作设置为"资源".它只是源目录中的一个文件,尚未通过拖放属性对话框添加到应用程序的资源集合中.我试图把它写成一个流,但我无法打开它,尽管尝试了很多点,斜线,命名空间和其他一切的变化.
我可以访问它以在xaml中使用"pack:// application:,,,/Resources/images/flags/tr.png",但我无法获取包含它的流.
大多数地方似乎都在说使用
using(BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResourceBlenderExpress.Resources.images.flags.tr.png"))) {
using(BinaryWriter writer = new BinaryWriter(File.OpenWrite(imageFile))) {
while((read = reader.Read(buffer, 0, buffer.Length)) > 0) {
writer.Write(buffer, 0, read);
}
writer.Close();
}
reader.Close();
}
Run Code Online (Sandbox Code Playgroud)
哪个我没有运气.
当您在代码中订阅事件时,Visual Studio会自动完成代码+=并生成相应的事件处理程序:
button.Click += new EventHandler(button_Click);
// ?_____auto generated code_____?
Run Code Online (Sandbox Code Playgroud)
请注意它是如何显式创建委托实例的:尽管自C#2以来方法组可以隐式转换为委托,但在VS2010中IDE行为仍然没有改变.
所以我想知道,有没有办法生成这样的代码呢?
button.Click += button_Click;
Run Code Online (Sandbox Code Playgroud)
编辑
只是为了让每个人都清楚:上面的代码不在设计器文件中(如果是这种情况,我不会关心使用哪种语法).这是+=在事件名称后键入并按下时触发的片段TAB
在Visual Studio中有一些令人讨厌的东西:当我展开或折叠方法或代码区域时,此操作将被推送到撤消堆栈.因此,如果我在方法中编辑某些代码,然后折叠该方法,然后想要撤消我的更改,我必须撤消两次:一次用于崩溃操作,一次用于代码更改.如果您在编辑代码后展开或折叠了几件事情,编辑器会不断跳到不同的地方并且您不知道您的更改是否已被撤消,这可能会非常混乱......
所以我的问题是:是否可以禁用该行为?即,在撤消堆栈中只考虑代码的变化?
PS:我正在使用Visual Studio 2008
编辑:如果这种行为也让你烦恼,请投票在UserVoice上修复它!
我的按钮有一个标准样式,但我希望样式的某些部分是可配置的.例如,当按钮触发MouseOver时,我会出现边框,我希望边框颜色可配置.
下面这篇文章:http://www.thomaslevesque.com/2011/10/01/wpf-creating-parameterized-styles-with-attached-properties/我以为我可以使用附加属性和TemplateBinding来实现这一目标.
我创建了以下附加属性:
public static class ThemeProperties
{
public static Brush GetButtonBorderColour(DependencyObject obj)
{
return (Brush)obj.GetValue(ButtonBorderColourProperty);
}
public static void SetButtonBorderColour(DependencyObject obj, Brush value)
{
obj.SetValue(ButtonBorderColourProperty, value);
}
public static readonly DependencyProperty ButtonBorderColourProperty =
DependencyProperty.RegisterAttached(
"ButtonBorderColour",
typeof(Brush),
typeof(ThemeProperties),
new FrameworkPropertyMetadata(Brushes.Black, FrameworkPropertyMetadataOptions.Inherits));
}
Run Code Online (Sandbox Code Playgroud)
我这样设置属性:
<Button Style="{StaticResource RedButton}" local:ThemeProperties.ButtonBorderColour="#B20000"/>
Run Code Online (Sandbox Code Playgroud)
我的风格看起来像这样:
<Window.Resources>
<Style x:Key="RedButton" TargetType="Button">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Margin" Value="2"/>
<Setter Property="FontFamily" Value="Tahoma"/>
<Setter Property="FontSize" Value="11px"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="MinHeight" Value="25" />
<Setter Property="FocusVisualStyle" …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个ComboBox非标准的下拉对齐.基本上,我希望下拉列表位于下方ComboBox,但与ComboBox左边缘的右边缘对齐.
通常的ComboBox样子,使用PlacementMode="Bottom":
我想要的是:
我试图Popup.PlacementMode在我的模板中使用该属性ComboBox,但没有一个可能的值似乎做我想要的.有没有一种简单的方法,最好是纯XAML?
我开始使用Metro风格的应用程序(我知道我们不应该将它称为Metro,但我永远不会记得它应该被称为...),而我正在实现一个DelegateCommand用于MVVM 的类.在WPF中,ICommand.CanExecuteChanged事件通常像这样实现:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
Run Code Online (Sandbox Code Playgroud)
但是这个CommandManager类在WinRT中不存在......还有别的东西吗?或者我们是否应该自己明确触发此事件?
当我git diff在C#文件上使用时,我看到这样的东西:
diff --git a/foo.cs b/foo.cs
index ff61664..dd8a3e3 100644
--- a/foo.cs
+++ b/foo.cs
@@ -15,6 +15,7 @@ static void Main(string[] args)
string name = Console.ReadLine();
}
Console.WriteLine("Hello {0}!", name);
+ Console.WriteLine("Goodbye");
}
}
}
Run Code Online (Sandbox Code Playgroud)
hunk标题行包含当前方法(static void Main(string[] args))的第一行,这很好.然而,它似乎并不是非常可靠......我看到很多情况它不起作用.
所以我想知道,这段摘录是从哪里来的?是否git diff以某种方式识别语言的语法?有没有办法定制它?