在一些遗留代码中,我看到了以下扩展方法,以便于添加新的键值项或更新值(如果该键已存在).
方法-1(遗留代码).
public static void CreateNewOrUpdateExisting<TKey, TValue>(
this IDictionary<TKey, TValue> map, TKey key, TValue value)
{
if (map.ContainsKey(key))
{
map[key] = value;
}
else
{
map.Add(key, value);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然,我已经检查过map[key]=value 完全相同的工作.也就是说,此方法可以替换为下面的方法-2.
方法2.
public static void CreateNewOrUpdateExisting<TKey, TValue>(
this IDictionary<TKey, TValue> map, TKey key, TValue value)
{
map[key] = value;
}
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是..如果我用Method-2替换Method-1会有什么问题吗?它会在任何可能的情况下破裂吗?
另外,我认为这曾经是HashTable和Dictionary之间的区别.HashTable允许更新项目,或使用索引器添加新项目,而词典则不行!在C#> 3.0版本中是否消除了这种差异?
如果用户再次发送相同的键值,则此方法的目标不是抛出异常,该方法应该只使用新值更新条目,并且如果已将新的键值对发送到该方法,则创建新条目.
我读过有关Generations和Large object heap的内容.但我仍然不明白拥有大型对象堆的意义(或好处)是什么?
如果CLR只是依赖于第2代(考虑到Gen0和Gen1的阈值很小来处理大型对象)来存储大型对象,那么可能出现什么问题(在性能或内存方面)?
我想编写一个函数,它可以验证给定值(作为字符串传递)对可能的值enum.在匹配的情况下,它应该返回枚举实例; 否则,它应该返回一个默认值.
该函数可能不在内部使用try/ catch,它排除使用Enum.Parse,在给定无效参数时抛出异常.
我想使用TryParse函数的一些东西来实现这个:
public static TEnum ToEnum<TEnum>(this string strEnumValue, TEnum defaultValue)
{
object enumValue;
if (!TryParse (typeof (TEnum), strEnumValue, out enumValue))
{
return defaultValue;
}
return (TEnum) enumValue;
}
Run Code Online (Sandbox Code Playgroud) 出于好奇,我尝试覆盖基类中的抽象方法,并实现抽象方法.如下:
public abstract class FirstAbstract
{
public abstract void SomeMethod();
}
public abstract class SecondAbstract : FirstAbstract
{
public abstract override void SomeMethod();
//?? what sense does this make? no implementaion would anyway force the derived classes to implement abstract method?
}
Run Code Online (Sandbox Code Playgroud)
很想知道为什么C#编译器允许编写'抽象覆盖'.这不是多余的吗?应该是一个编译时错误来做这样的事情.是否适用于某些用例?
谢谢你的关注.
只是想知道为什么我们char在C#(.NET)中有2字节大小的类型,而不像其他编程语言中的1字节?
根据此MSDN链接,
没有办法只替换控件的部分可视树; 若要更改控件的可视树,必须将控件的Template属性设置为新的完整ControlTemplate
.
我试图禁用GridViewColumnHeader的点击行为(我需要删除原始控件模板中的一些触发器),但我无法找到本机"ColumnHeaderContainerStyle".我发现的所有人似乎已经做了一些定制,很难获得原始的外观和感觉.
有人可以建议我如何/在哪里可以获得原生WPF控件中定义的原始控件模板?
谢谢你的关注.
每当我覆盖基类的方法时,除了我实现这个方法之外,我似乎有3个选择.
1)调用base.Method(),然后提供我的实现.
2)提供我的实现,然后调用base.Method()
3)只提供我的实施.
最近在使用库的过程中,由于没有按照库的预期实现方法,我发现了很少的错误.我不确定图书馆的部分内容是否有问题,或者我的理解有些不对劲.
我举一个例子.
public class ViewManager {
public virtual void Customize(){
PrepareBaseView();
}
}
public class PostViewManager {
public override void Customize(){
base.Customize();
PreparePostView();
}
}
public class PreViewManager {
public override void Customize(){
PreparePreView();
base.Customize();
}
}
public class CustomViewManager {
public override void Customize(){
PrepareCustomView();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,子类如何知道(不看基类实现)父类所期望的顺序(或选项)?有没有一种方法可以让父类强制执行所有派生类的三个替换中的一个?
考虑以下代码:
public class TableMain {
public virtual event Action UpdateFilter;
....
}
public class TableSub : TableMain {
public override event Action UpdateFilter;
public void UpdateQuery() {
.....
if (UpdateFilter!=null) {
UpdateFilter(); // Invocation of polymorphic field-like event???
}
}
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,ReSharper显示警报"调用多态字段事件".
我的问题是:它究竟意味着什么?这是一个糟糕的编程习惯的警报吗?此外,以多态方式调用事件是不好的做法吗?(知道事件只能从声明它的类中提出.)
根据我的理解,在运行时完成锁(obj)的代码块之前不会释放锁(因为当块完成时,它会调用Monitor.Exit(obj).
有了这种理解,我无法理解以下代码行为背后的原因:
private static string obj = "";
private static void RecurseSome(int number)
{
Console.WriteLine(number);
lock (obj)
{
RecurseSome(++number);
}
}
Run Code Online (Sandbox Code Playgroud)
// 电话: RecurseSome(0)
// 输出: 0 1 2 3...... stack overflow exception
必须有一些我缺少的概念.请帮忙.
我正在寻找一个perforce命令来获取已在本地修改并"未"签入存储库的文件列表.
我理解我"应该"在待处理的更改列表中获取已修改文件的列表,但有些情况下我无法在该列表中看到修改过的文件.然后在"手动"检出文件并做差异我意识到差异.
是否有任何命令可以检查给定文件夹中的所有文件,并提供一个与存储库中的状态不同的文件列表?
我试过"p4同步",但那没用.
谢谢你的关注.
c# ×7
.net ×3
overriding ×3
abstract ×1
clr ×1
dictionary ×1
diff ×1
enums ×1
events ×1
inheritance ×1
locking ×1
perforce ×1
polymorphism ×1
styles ×1
wpf ×1