问题:测试是否x∉{2,3,61,71}
我经常想知道是否有更好的方法:
if (x != 2 && x != 3 && x != 61 && x != 71)
{
// do things
}
Run Code Online (Sandbox Code Playgroud)
和
if (!new List<int>{ 2, 3, 61, 71 }.Contains(x))
{
// do things
}
Run Code Online (Sandbox Code Playgroud)
后者看起来相当优雅,但实际上如果你读它会有点恼火,特别是因为倒置.这是一种丑陋的事情,因为在英语中我们说"x不是...的元素",这在C#中难以表达而不会刺激开销.也许一个人if (Object(x).IsElementOf(new[] { ... }))
怎么说?
嗯......有什么建议吗?是否有任何.Net标准方法来测试这样的事情?
我需要找到与项目中某个主题相关的TFS工作项.为此,我尝试使用Visual Studio中的查询构建器查询工作项.
由于我希望搜索多个术语,我想象一个这样的查询:
WHERE (
Priority > 300 AND
(Title.Contains('Dog') OR Title.Contains('Cat') OR Title.Contains('Hamster')))
Run Code Online (Sandbox Code Playgroud)
现在,根据http://msdn.microsoft.com/en-us/library/dd286638.aspx(节和/或)应该能够做到这一点,像这样:
| Priority| > | 300
And | Title | Contains | Dog
Or | Title | Contains | Cat
Or | Title | Contains | Hamster
Run Code Online (Sandbox Code Playgroud)
但是......这不能像所描述的那样起作用:据我所见,这被视为
(优先级> 300 AND Title.Contains('Dog'))或Title.Contains('Cat')OR Title.Contains('Hamster')))
现在这对我来说有点问题,因为除了"优先级"标准之外,我还有8个额外的标准需要应用于所有匹配(日期,状态等).我不仅有三场冠军赛,而且还有十场左右.因此,这将成倍增加,我最终会得到一个非常长且多数冗余的查询.
..或者,我在这里遗漏了什么?有没有其他方式来表达这些陈述?或者是否有另一种方法来查询TFS工作项,比如另一种工具?
谢谢!
有人希望我让其他人的代码符合某些FxCop规则集,其中包括规则CA1726:使用首选术语.大多数术语/替换都是正确的,我可以理解,人们必须决定用一种方法来命名.
但是,"旗帜"一词的处理方式是什么?任何人都可以向我解释为什么我不会使用这个名字?(在我去老板之前抱怨它之前;))
比如,我有一个数据对象,它有一个类'flags'的成员,它捆绑了大量定义如何处理数据对象的属性.你怎么称呼这个?
之前我遇到过这个FxCop规则,并不满足于如何解决违规(thread1,thread2).我现在有另一个案例需要纠正违反CA1819的行为.
具体来说,我有一个算法库,它在曲线(x,y)上执行一些分析计算,公共"输入对象"如下:
public class InputObject
{
public double[] X { get; set; }
public double[] Y { get; set; }
// + lots of other things well
}
Run Code Online (Sandbox Code Playgroud)
此对象的X和Y属性在库中的数百个位置中使用,通常使用索引.输入对象永远不会被算法改变,但实际上它应该无关紧要.而且,.Length
经常被称为.它是一个数学库,并且double[]
是那里的标准数据类型.无论如何,修复CA1819将需要相当多的工作.
我考虑使用List<double>
,因为Lists支持索引并且与数组非常相似,但我不确定这是否会减慢算法速度或者FxCop是否会对这些列表感到满意.
更换这些double[]
属性的最佳选择是什么?
I want to do something like this:
double a, b, c, d, e;
ParseAndWrite("{1, 2, 3}", ref a, ref b, ref c);
ParseAndWrite("{4, 5}", ref d, ref e);
-> a = 1, b = 2, c = 3, d = 4, e = 5
Run Code Online (Sandbox Code Playgroud)
However, I can not write a function like this:
private void ParseAndWrite(string leInput, params ref double[] targets)
{
(...)
}
Run Code Online (Sandbox Code Playgroud)
This doesn't work, for some reason one can not use ref and params at the same …
我想为我的控制器逻辑引入一些enum用于某些类型的安全性,所以例如我创建了这样的东西:
var app = angular.module('myApp', []);
var StateEnum = Object.freeze({"login":1, "logout":2})
function LoginCheckCtrl($scope) {
$scope.stateEnum = StateEnum
$scope.loginData = StateEnum.login
$scope.login = function() {
console.log($scope.loginData ? 'logged in' : 'not logged in');
$scope.loginData = StateEnum.logout;
};
$scope.logout = function() {
console.log($scope.loginData ? 'logged in' : 'not logged in');
$scope.loginData = StateEnum.login;
};
}
Run Code Online (Sandbox Code Playgroud)
在我的示例页面中,我会有这样的事情:
<div ng-controller="LoginCheckCtrl">
<div ng-switch on="loginData">
<div ng-switch-when="stateEnum.login" ng-include="'login'"></div>
<div ng-switch-when="stateEnum.logout" ng-include="'logout'"></div>
</div>
</div>
<script type="text/ng-template" id="login">
<button ng-click="login()">Login</button>
</script>
<script type="text/ng-template" id="logout">
<button ng-click="logout()">Logout</button>
</script>
Run Code Online (Sandbox Code Playgroud)
但 …
虽然之前已经讨论了主题,但建议的解决方案似乎不起作用..
我在表单应用程序中有一个按钮单击回调方法,它显示了一个文件夹选择器对话框:
private void ButtonSelectReporterFolderClick(object sender, EventArgs e)
{
using (var dialog = new FolderBrowserDialog()) // causes warning
{
if (dialog.ShowDialog() == DialogResult.OK)
{
this.boxReporterFolderPath.Text = dialog.SelectedPath;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生一个警告:
CA2000: Microsoft.Reliability : In method 'MainWindow.ButtonSelectReporterFolderClick(object, EventArgs)', object '<>g__initLocal' is not disposed along all exception paths. Call System.IDisposable.Dispose on object '<>g__initLocal' before all references to it are out of scope.
我也试过使用try
- finally
块甚至调用dialog.Dispose没有任何块,一切都无济于事 - 警告仍然存在,始终在初始化线.
抱歉打扰你这么简单的问题,但是我被困在这里一个小时:
我有一个看起来像这样的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<aaa xmlns="http://blabla.com/xmlschema/v1">
<bbb>
<ccc>Foo</ccc>
</bbb>
<ddd x="y" />
<ddd x="xx" />
<ddd x="z" />
</aaa>
Run Code Online (Sandbox Code Playgroud)
我试图像这样访问元素'ddd':
var doc = new XmlDocument();
doc.Load("example.xml");
foreach (XmlNode dddNode in doc.DocumentElement.SelectNodes("//ddd"))
{
// do something
Console.WriteLine(dddNode.Attributes["x"].Value);
}
Run Code Online (Sandbox Code Playgroud)
在运行时,跳过foreach循环,因为我没有从.SelectNodes方法返回任何节点.我在循环之前打破并查看了InnerXML,看起来很好,我还尝试了各种各样的XPath(比如"// bbb"或"/ aaa/ddd"),但只有"/"似乎没有返回空值.
这个确切的代码之前适用于我,现在它没有.我怀疑aaa标签中的命名空间声明,但我无法弄清楚为什么这会导致问题.或者......你能看到我可能遗失的任何东西吗?
我经常想知道正确的方法:
例如,在我的程序中,我有大约100个常量(或枚举)用于某些计算.它们最好存放在一个地方.它们可以按层次分组,例如:
System3 / Rules / Rule7 / ParameterXY / MaxAverageValue
Run Code Online (Sandbox Code Playgroud)
当然,我希望在编码时可以访问这些值,因此将它们存储在某种资源中并不是一种选择.
据我所知,这可以通过以下方式完成:
使用名称非常难看,而且它的维护性也不是很好.我发现嵌套类是一种很好的方法,但是一些stylecop/fxcop规则禁止这样做,所以这在某种程度上肯定是"坏"的.最后,我发现建议的替代方案,使用命名空间,并不是非常好.Imho它创建了大量的文件夹和文件,每个文件夹和文件几乎都没有.我不喜欢在装配反射器中弹出50个子命名空间.
那么..你是怎么做这种任务的?你会建议什么?
我尽可能地让其他人的代码符合一些StyleCop规则集.现在我想知道以下情况:
我有一个包含字段的抽象类
protected double[] coefficients;
Run Code Online (Sandbox Code Playgroud)
Stylecop说:SA1401:必须使用私人访问声明字段.使用属性公开字段.
所以我改成了:
protected double[] coefficients { get; set; }
Run Code Online (Sandbox Code Playgroud)
Stylecop说:SA1300:属性名称以大写字母开头:系数.
由于它是一个抽象类,因此子类无法控制.他们使用他们父母的课堂base.coefficients
......好吧.
那么......除了压制(或禁用)它之外没有别的办法摆脱这个警告吧?:T
c# ×8
.net ×5
fxcop ×3
coding-style ×2
angularjs ×1
ca2000 ×1
constants ×1
enums ×1
inheritance ×1
javascript ×1
namespaces ×1
params ×1
protected ×1
ref ×1
rules ×1
stylecop ×1
tfs ×1
workitem ×1
xml ×1
xmlreader ×1