如果我有一个enum标记的[Flags],有没有办法在.NET中测试这种类型的值,看它是否只包含一个值?我可以使用位计数得到我想要的结果,但如果可能的话我宁愿使用内置函数.
在enum动态循环遍历值时,Enum.GetValues()也会返回组合标志.enum在以下示例中调用该函数将返回4个值.但是,我不希望内部算法中包含值组合.测试单个enum值的相等性是不合适的,因为它enum可能包含许多值,并且在enum更改中的值时还需要额外的维护.
[Flags]
enum MyEnum
{
One = 1,
Two = 2,
Four = 4,
Seven = One | Two | Four,
}
void MyFunction()
{
foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum)))
{
if (!_HasSingleValue(enumValue)) continue;
// Guaranteed that enumValue is either One, Two, or Four
}
}
private bool _HasSingleValue(MyEnum value)
{
// ???
}Run Code Online (Sandbox Code Playgroud)
我有一个带有flag参数的方法.我认为将布尔值传递给方法是一种不好的做法(使签名复杂化,违反了"每种方法做一件事"的原则).我认为将方法分为两种不同的方法更好.但如果我这样做,这两种方法将非常相似(代码重复).
我想知道是否有一些通用技术将带有flag参数的方法拆分为两个独立的方法.
这是我的方法(Java)的代码:
int calculateNumOfLiveOrDeadNeighbors(Cell c, int gen, boolean countLiveOnes) {
int x = c.getX();
int y = c.getY();
CellState state;
int aliveCounter = 0;
int deadCounter = 0;
for (int i = x - 1; i <= x + 1; i++) {
for (int j = y - 1; j <= y + 1; j++) {
if (i == x && j == y)
continue;
state = getCell(i, j).getCellState(gen);
if (state == CellState.LIVE || state == CellState.SICK){
aliveCounter++;
} …Run Code Online (Sandbox Code Playgroud) 嘿,有没有办法在C#中存储负面标志?例如,我有以下标志枚举代表一些样式:
[Flags]
public enum Styles
{
Default = 0,
Bold = 1,
Italic = 2
}
Run Code Online (Sandbox Code Playgroud)
现在我有多个对象,可以应用这些样式,然后将所有相关组合起来(即其他对象可以继承一些以前设置的样式).除此之外,我想定义负面标志,基本上撤消继承的样式.因此,如果先前将样式设置为Styles.Bold | Styles.Italic并且对象继承了该样式但Styles.Bold设置了负标志,则结果应该是正确的Styles.Italic.
是否有任何机制已经这样做了?我现在基本上有两种方式:首先是定义NotXY枚举值,然后以某种方式解析以消除XY设置时的值.
另一个是简单地定义两个字段,正标志和负标志,其中负标志是在额外字段中专门定义的,我通过简单的方式得到结果标志positiveFlags ^ negativeFlags.
如果不清楚,我需要存储每个中间对象的样式.所以它可能是这样的:
object1: Default
object2: Bold
object3: -Bold Italic
Run Code Online (Sandbox Code Playgroud)
如果object3也继承了1和2的值,那么最终结果应该是正确的Italic.
回答Kieren Johnstone的问题的另一个例子,并且根据我在评论中的陈述,负值仅适用于当前级别:
1: Bold
2: -Bold -Italic
3: Italic
Run Code Online (Sandbox Code Playgroud)
2从先前的对象中消除了Bold和Italic,但是不应该再应用任何进一步的(正值应该),因此最终值将Italic再次出现.
我有一段意图的代码:
Intent i = new Intent();
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
i.setComponent(new ComponentName(packToLaunch, nameToLaunch));
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
这基本上是基于我传递给它的包名称启动一个新活动.有时,启动此新活动最多需要5秒钟.有没有办法加快这个过程?当我有一个仍在运行的应用程序时,它甚至需要很长时间.请帮忙...
在Java方法中指定标志的最佳做法是什么?
我已经看到SWT使用int作为位域,如:
(部分来自"Effective Java,2nd Ed."第159页):
public class Text {
public static final int STYLE_BOLD = 1 << 0; // 1
public static final int STYLE_ITALIC = 1 << 1; // 2
void printText(String text, int flags) {
}
}
Run Code Online (Sandbox Code Playgroud)
你的客户电话看起来像:
printText("hello", Text.STYLE_BOLD | Text.STYLE_ITALIC);
Run Code Online (Sandbox Code Playgroud)
..但是这是不鼓励的,因为你可以将来自不同类的标志(int值)混合在一起,而无需任何编译器检查.
在同一本书("Effective Java")中,我看到了EnumSet的使用,但随后您的用户调用变为:
printText("hello", EnumSet.of(Style.Bold, Style.ITALIC));
Run Code Online (Sandbox Code Playgroud)
我发现这有点冗长,我更喜欢SWT的优雅.
还有其他选择还是这基本上是你必须选择的两种口味?
在寻找将有序多对多关系添加到我的核心数据模型的方法时,我对模型的更改量变化最小,我注意到了多对多关系的选项ordered(见下面的截图).哇,听起来不错,但它做了什么?
当我检查或取消选中它时,我的SQLite商店没有抱怨,我的应用程序仍然可以编译并运行正常.我想也许轻量级迁移可以处理变化,但从它的外观来看,我所有的自定义NSManagedObject子类都可以工作而不需要修改,所以发生了什么?

总结一下问题:
ordered标志是否应该将to-many关系的数据类型更改NSSet为NSArray?非常感谢!
我注意到PHP中的一些函数使用flags作为参数.是什么让他们独特而不是普通的字符串参数?我问,因为我想在我自己的自定义函数上使用它们,但我很好奇这个过程是做什么的.
编辑:总结一下,何时最好使用标志创建自定义函数,何时不是?
我们不是将每个权限拆分成单独的列或sql server表,而是重新考虑使用Flag属性来Enum使用逐位操作.我们的应用程序定义端点(不是休息服务中的端点)来访问资源(读取,修改,更新),并且每个用户都有权限,例如Bob has permissions to Read, Modify resource X当bob到来并访问此资源时,我们检查bob是否具有权限x.现在我们将要应用的地方很清楚这里是我的疑惑
假设Bob使用标记的枚举对资源有读,写,删除权限我会做的Permission.Read | Permission.Write | Permission.Delete是比特的结果和整数或另一个枚举?
对于在数据库表中存储此权限,列应该是integer?
如果回答问题1 Enum那么我应该在Permissions枚举上定义另一个属性,表示Bit wise和operation的整数值吗?
disclaimer:示例中提到的Bob并不代表Stack溢出网络中的任何用户或任何人.这只是另一个角色
我正在编写一个将在目录上运行的Batch脚本.我希望能够添加一个标志(例如-r或/ r或类似的东西),使脚本运行文件夹树而不是单个目录.是否可以使用批处理添加标记选项?
谢谢
我是Perl的新手,最近遇到了以下问题.我的Perl代码必须全部驻留在一个文件中(它由另一个我无法控制的程序调用).我现在希望使用标志运行脚本(例如,perl myscript.pl -T对于污点模式),尽管它最初是在没有标志的情况下调用的.我怎么能这样做,即如何从Perl文件中"设置标志"?
我有一个想法是让文件再次启动(在没有标志的情况下调用之后),这次使用-T标志(通过发出诸如shell的命令system($^X, "myscript.pl -T", @ARGS);).那会有用吗?有更好的想法吗?
flags ×10
c# ×3
enums ×3
.net ×2
java ×2
android ×1
batch-file ×1
coding-style ×1
components ×1
core-data ×1
enumset ×1
function ×1
objective-c ×1
package ×1
perl ×1
permissions ×1
php ×1
refactoring ×1
swt ×1