在C#中,假设我有一个名为Note的类,其中包含三个String成员变量.
public class Note
{
public string Title;
public string Author;
public string Text;
}
Run Code Online (Sandbox Code Playgroud)
我有一个类型列表注意:
List<Note> Notes = new List<Note>();
Run Code Online (Sandbox Code Playgroud)
获取"作者"列中所有不同值的列表最简洁的方法是什么?
我可以遍历列表并将所有不重复的值添加到另一个字符串列表中,但这看起来很脏且效率低下.我有一种感觉,有一些神奇的Linq结构可以在一条线上做到这一点,但我无法想出任何东西.
我从某个地方抛出了异常,但是我从编译器得到的只是"mscorlib.dll中出现类型'System.ArgumentOutOfRangeException'的第一次机会异常".这对我来说没用,因为那不是我的代码(很确定它是默认库).我想看到堆栈跟踪或其他什么,所以我知道在我的代码中出错的地方.它是一个相当大的代码库(其中大部分都不是我的),而且还有很多多线程和其他东西正在进行中,所以几乎不可能尝试逐步完成代码而不知道从哪里开始查看.是否有某些设置可以使所有异常触发中断,因此我可以在调用堆栈出现时看到它们,而不是仅仅让它们在输出中以无效的错误消息无声地失败?
我试图弄清楚是否有任何方法可以避免因预处理器引起的某些事情而出现"无法访问的代码"警告.我不希望禁止所有这样的警告,只有那些将取决于预处理,如
#if WINDOWS
public const GamePlatform platform = GamePlatform.PC;
#else
public const GamePlatform platform = GamePlatform.MAC;
#endif
Run Code Online (Sandbox Code Playgroud)
后来有代码:
if (platform == GamePlatform.PC)
{
...
}
else
{
...
}
Run Code Online (Sandbox Code Playgroud)
这两个部分中的一个将始终被检测为"无法访问的代码",并且我们已经将这些部分全部到位.我想尝试摆脱它创建的许多警告,但我仍然希望得到合法无法访问的代码的警告.(实际上,不仅仅是两个平台,因此每个特定于平台的代码都会产生一堆不必要的警告.)
c# visual-studio-2010 compiler-warnings unreachable-code c-preprocessor
我有一个着色器,我想在顶点着色器中移动一半顶点.我试图从性能的角度来决定最好的方法,因为我们处理的是超过100,000个顶点,因此速度至关重要.我看了3种不同的方法:(伪代码,但足以给你这个想法.<complex formula>
我不能给出,但我可以说它涉及一个sin()
函数,以及一个函数调用(只是返回一个)数字,但仍然是函数调用),以及浮点数的一堆基本算术).
if (y < 0.5)
{
x += <complex formula>;
}
Run Code Online (Sandbox Code Playgroud)
这样做的优点<complex formula>
是只执行了一半的时间,但缺点是肯定会导致分支,实际上可能比公式慢.它是最具可读性的,但在这种情况下我们更关心速度而不是可读性.
x += step(y, 0.5) * <complex formula>;
Run Code Online (Sandbox Code Playgroud)
使用HLSL的step()函数(如果第一个参数更大则返回0,如果更少则返回1),可以消除分支,但现在<complex formula>
每次都调用它,并且其结果乘以0(因此浪费了精力)一半的时间.
x += (y < 0.5) ? <complex formula> : 0;
Run Code Online (Sandbox Code Playgroud)
这个我不知道.是否?:
会导致一个分支?如果不是,那么等式的两边都要进行评估,还是只考虑相关的一方?
最后的可能性是<complex formula>
可以将其卸载回CPU而不是GPU,但我担心在计算sin()和其他操作时会更慢,这可能会导致净损失.此外,这意味着必须将另外一个数字传递给着色器,这也可能导致开销.任何人都有任何见解,哪个是最好的行动方案?
附录:
根据http://msdn.microsoft.com/en-us/library/windows/desktop/bb509665%28v=vs.85%29.aspx
该step()
函数在?:
内部使用,所以它可能并不比我的第三个解决方案更好,并且可能更糟,因为<complex formula>
每次都会被调用,而它可能只用一半时间调用?:
.(目前还没有人回答这部分问题.)虽然避免使用和使用:
x += (1.0 - y) * <complex formula>;
Run Code Online (Sandbox Code Playgroud)
可能比其中任何一个都好,因为在任何地方都没有比较.(并且y
始终为0或1.)仍然执行<complex formula>
不必要的一半时间,但可能值得完全避免分支.
假设我有一个我希望在DataGridView中显示的属性,但是当PropertyGrid中显示相同的对象时却没有.我知道我可以使用[Browsable(false)]
,但是在两个视图中都隐藏了它.我也可以做一个gridView.Columns["blah"].Visible = false;
,但这与我想要的相反,因为它隐藏在DataGridView中而不是隐藏在PropertyGrid中.有没有办法反过来?(创建一个全新的数据表只是持有相同的数据减去一个字段,并且,与其重新绑定所有的短-这是一个真正的杂牌组装电脑的方式来做事.)或者,我可以用它添加一列到DataGridView解决生活在实际课程中不存在.
我很少故意关闭Visual Studio.我正在进行的项目是如此巨大,以至于加载它需要大约15分钟,所以我的做法只是让解决方案在一夜之间打开,这样第二天早上就可以为我做好准备了.我现在唯一需要重新启动程序的是它崩溃了 - 发生了什么.每隔一段时间我就会做一些它不喜欢的事情而且它会退出我身上.我接受这个.我喜欢它是防弹的,但我几乎没想到.
这样做的缺点是,显然,程序运行时更改的任何设置(字体和颜色,键盘快捷键,自动格式设置,基本上是工具/选项对话框中的任何设置)仅在您合法退出程序时保存.崩溃时不保存这些设置.所以我发现自己不得不重做我每次都做的任何设置更改.
首先 - 为什么在更改设置时它没有保存设置?这有多难?认为你的程序将始终正常关闭并且在关机过程之前不打扰保存状态是一定程度的傲慢.(并没有在异常关机过程中保存设置)我会因为编写代码而遭到解雇(或者至少受到谴责),那么微软如何逃脱它呢?有没有办法强制它保存设置而不退出和重新加载?
可能重复:
使C++程序崩溃的最简单方法是什么?
我在代码库中经常看到一个构造,程序以某种方式进入无效状态,代码会故意做错,只是为了强制崩溃.它通常是这样的:
if(<something is wrong>)
{
int *ptr = NULL;
*ptr = 0;
}
Run Code Online (Sandbox Code Playgroud)
这当然会导致空引用异常并以不可恢复的方式崩溃程序.我只是想知道这是否真的是最好的方法呢?首先,它读得不好.如果没有评论,您可能没有意识到此处发生的崩溃是有意的.其次,几乎没有办法从中恢复.它不会抛出异常,因此其他代码无法处理它.它只会使程序死亡,无法回溯.它也没有提供很多线索,说明为什么它必须在这里崩溃.它会在所有版本中崩溃,不像断言.(我们确实有一个非常强大的断言系统,但在这种情况下并不总是这样.)
这是我们在整个地方使用的风格,我无法试图说服任何人.我只是好奇这个行业有多常见.
我偶然发现了这个技巧,从匿名内部类中获取一个值,该变量在外部类中声明.它有效,但感觉就像一个肮脏的黑客:
private int showDialog()
{
final int[] myValue = new int[1];
JPanel panel = new JPanel();
final JDialog dialog = new JDialog(mainWindow, "Hit the button", true);
dialog.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
JButton button = new JButton("Hit me!");
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
myValue[0] = 42;
dialog.setVisible(false);
}
});
panel.add(button);
dialog.add(panel);
dialog.pack();
dialog.setVisible(true);
return myValue[0];
}
Run Code Online (Sandbox Code Playgroud)
(是的,我意识到这个例子可以用一个简单的替换JOptionPane
,但我的实际对话框要复杂得多.)内部函数坚持认为它与之交互的所有变量都是final
,但我不能将其声明myValue
为final,因为内部函数需要为其分配一个值.将它声明为1元素阵列解决了这个问题,但似乎它可能是某种坏事TM.我想知道是否a.)这是常见做法或b.)这可能导致任何严重问题.
我注意到有两种方法可以获得向量(或其他容器类)的结束迭代器:
std::end(myVector)
Run Code Online (Sandbox Code Playgroud)
和
myVector.end()
Run Code Online (Sandbox Code Playgroud)
这同样适用于其他各种容器迭代器功能begin
,cend
,cbegin
,rend
,rbegin
,crend
,crbegin
,find
,等,如果有这些之间的任何功能上的区别是什么我不知道是什么?如果没有,是否有一些历史原因让他们两个?
(如果这是重复的道歉,我已经搜索了全部,并且发现了这些方法中的一个或另一个的大量来源,但没有提到两者或比较两者.)
可能重复:
如何从捕获的异常中打印消息?
如果这是基本的或重复的道歉 - 我先做了几次搜索,但没有找到任何答案.
如果我做一些基本的事情:
throw exception("This thing didn't work");
Run Code Online (Sandbox Code Playgroud)
我在哪里可以看到它?字符串不会显示在输出控制台,堆栈跟踪或与项目关联的任何.log文件中.让我想知道为什么我甚至在那里放一根绳子,如果它在任何地方都看不到的话.我当然可以使用堆栈跟踪来查看它爆炸的位置,但这种方式首先会破坏出现异常的目的.
在Java中,当我给它一个字符串时,我会在输出的某处看到该字符串.我只是想知道是否有可能在C++中重现这种行为.
c# ×4
c++ ×3
crash ×2
exception ×2
assert ×1
branch ×1
coding-style ×1
containers ×1
datagridview ×1
debugging ×1
dialog ×1
distinct ×1
final ×1
hide ×1
hlsl ×1
iterator ×1
java ×1
linq ×1
list ×1
optimization ×1
properties ×1
propertygrid ×1
settings ×1
shader ×1
stack-trace ×1
stl ×1
swing ×1