我一直在讨论关于DRY(不要重复自己)的原则,也称为DIE(Duplication Is Evil),并且有投票,任何简单的代码重复总是邪恶的.我想听听你对以下几点的看法:
上述情况是否是放弃抽象过程的好理由,只留下重复的代码以支持未来变更的风险或只是可读性?
有一个:
enum SomeEnum
{
A = 0,
B = 1,
C = 2
}
Run Code Online (Sandbox Code Playgroud)
现在编译器允许我写:
SomeEnum x = SomeEnum.A;
switch(x)
{
case 0: // <--- Considered SomeEnum.A
break;
case SomeEnum.B:
break;
case SomeEnum.C:
break;
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
0
被认为SomeItems.A
.但我写不出来:
SomeEnum x = SomeEnum.A;
switch(x)
{
case 0:
break;
case 1: // <--- Here is a compilation error.
break;
case SomeEnum.C:
break;
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
为什么只存在隐式转换0
?
假设我有桌子#Foo:
Id Color
-- ----
1 Red
2 Green
3 Blue
4 NULL
Run Code Online (Sandbox Code Playgroud)
和表#Bar:
Value
-----
1
2.5
Run Code Online (Sandbox Code Playgroud)
我想创建表Result使用简单的语句来获取:
Id Color Value
-- ---- -----
1 Red 1
2 Green 2.5
3 Blue NULL
4 NULL NULL
Run Code Online (Sandbox Code Playgroud)
到目前为止我发明的是:
WITH cte1
AS
(
SELECT [Id], [Color], ROW_NUMBER() OVER (ORDER BY [Id]) AS 'No'
FROM #Foo
),
cte2
AS
(
SELECT [Value], ROW_NUMBER() OVER (ORDER BY [Value]) AS 'No'
FROM #Bar
)
SELECT [Id], [Color], [Value]
FROM cte1 c1
FULL OUTER JOIN …
Run Code Online (Sandbox Code Playgroud) 我需要一个解决方案来执行任意暂停.延迟准确性无关紧要.WaitHandle.WaitOne方法(TimeSpan)和Thread.Sleep方法之间的这种情况有什么实际区别.还有更好的解决方案吗?
我有以下代码,它有效:
public DataTemplate ItemTemplate
{
get { return _list.ItemTemplate; }
set { _list.ItemTemplate = value; }
}
Run Code Online (Sandbox Code Playgroud)
我有代码,我想拥有,但它不起作用.甚至从不调用setter:
public static readonly DependencyProperty ItemTemplateProperty = DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(MyUserControl));
public DataTemplate ItemTemplate
{
get { return (DataTemplate)GetValue(ItemTemplateProperty); }
set
{
_list.ItemTemplate = value;
SetValue(ItemTemplateProperty, value);
}
}
Run Code Online (Sandbox Code Playgroud)
使用它在XAML中:
<Window.Resources>
<DataTemplate x:Key="ItemTemplate">
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
</Window.Resources>
<local:MyUserControl ItemTemplate="{StaticResource ItemTemplate}"/>
Run Code Online (Sandbox Code Playgroud)
为什么标准属性工作而依赖属性不起作用?
为了简单说明我的困境,让我说我有以下代码:
class A
{
// May be set by a code or by an user.
public string Property
{
set { PropertyChanged(this, EventArgs.Empty); }
}
public EventHandler PropertyChanged;
}
class B
{
private A _a;
public B(A a)
{
_a = a;
_a.PropertyChanged += Handler;
}
void Handler(object s, EventArgs e)
{
// Who changed the Property?
}
public void MakeProblem()
{
_a.Property = "make a problem";
}
}
Run Code Online (Sandbox Code Playgroud)
为了履行其职责,B级必须对A的PropertyChanged事件作出反应,但在某些情况下也能够自行交替该属性.不幸的是,其他对象也可以与Property进行交互.
我需要一个顺序流的解决方案.也许我可以使用一个变量来禁用一个动作:
bool _dontDoThis;
void Handler(object s, EventArgs e)
{
if …
Run Code Online (Sandbox Code Playgroud) 在某些情况下,我手动或自动覆盖文件,但没有提前检查它,因此在 p4v 中我将其视为没有红色小鸟的蓝色图标。此类文件未显示在待处理列表中,我需要在工作区树中查找它。
如何过滤掉p4v中覆盖但未签出的文件?
我想知道是否有一种简单的方式来处理C#中的某种事务.我们假设我们有两个属性,我们想更新它们的值.我们可以写:
A = GetA();
B = GetB();
Run Code Online (Sandbox Code Playgroud)
问题是,如果在分配B时抛出异常,那么对象将处于不一致状态,因为A已被更新.我们可以通过存储A的当前值并在处理B时捕获异常来解决这个问题:
var tempA = A;
A = GetA(); // A is up to date
try { B = GetB(); } catch { A = tempA; } // B is up to date also or A is reverted
Run Code Online (Sandbox Code Playgroud)
即使上面的解决方案也不是保存,因为在还原A时可以抛出异常,但关键是,如果.NET中有内置机制来完成这样的操作?
我可以想象如下的声明:
transaction { A = GetA(); B = GetB(); }
Run Code Online (Sandbox Code Playgroud)
或代码构造如:
Transaction.Enter();
A = GetA();
B = GetB();
Transaction.Leave();
Run Code Online (Sandbox Code Playgroud)
在交易之前,将存储机器状态,并且在交易之后,如果发生异常,它将被还原.在.NET中有类似的东西吗?
尽管它看起来像是基于主要意见的问题,但并非绝对如此。
我想知道在 SQL 中创建约束的每个可能约定的优缺点是什么。由于我使用 SQL Server,因此我将展示三个我熟悉的创建主键约束的示例:
CREATE TABLE Persons (Id int NOT NULL PRIMARY KEY);
CREATE TABLE Persons (Id int NOT NULL, CONSTRAINT PK_Persons_Id PRIMARY KEY(Id));
CREATE TABLE Persons (Id int NOT NULL); ALTER TABLE Persons ADD CONSTRAINT PK_Persons_Id PRIMARY KEY (Id);
这些都是优点和缺点,这是我目前发现的。也许更有经验的开发人员可以指出在开发和生产环境中创建主键和其他约束时可以帮助做出最佳决策的其他因素。例如:
我相信我们可以分享关于一种语法何时比另一种语法具有实际优势的知识。
在.NET Framework 4.5的Monitor文档中,我找到了一个句子,它表示lock关键字使用Monitor的Enter(Object,Boolean)方法:
Enter和Exit方法提供的功能与C#lock语句(Visual Basic中的SyncLock)提供的功能相同,只是lock和SyncLock在尝试中包装Enter(Object,Boolean)方法重载和Exit方法... finally阻止(尝试...最后在Visual Basic中)以确保释放监视器.
另一方面,在监视器的重叠中,有:
Visual Basic SyncLock和C#锁定语句使用MonitorEnter获取锁定,MonitorExit使用它来释放它.
上面的MonitorEnter指的是比以前不同版本的Enter方法,即:Enter(Object)
在Visual Studio 2012的线程同步(C#和Visual Basic)中,有一个示例锁定如何包装Monitor:
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
DoSomething();
}
finally
{
System.Threading.Monitor.Exit(obj);
}
Run Code Online (Sandbox Code Playgroud)
还有Enter(对象)版本.
什么是真的?lock语句是调用Enter(Object,Boolean)还是Enter(Object)?它是如何真正完成的?
c# ×6
.net ×4
sql-server ×2
wpf ×2
database ×1
enums ×1
locking ×1
monitor ×1
p4v ×1
perforce ×1
refactoring ×1
sql ×1
t-sql ×1
waithandle ×1
xaml ×1