我们正在使用Perforce和Visual Studio.每当我们创建一个分支时,除非我们使用"从源代码管理中打开",否则某些项目不会被绑定到源代码控制,但其他项目无论如何都可以工作.从我的调查中,我知道一些涉及的事情:
在我们的.csproj文件中,有以下设置:
有时它们都被设置为"SAK",有时不是.如果这些说"SAK",事情似乎更有可能奏效.
在我们的.sln文件中,有许多项目的设置:
(#是标识每个项目的数字.)SccLocalPath是相对于解决方案文件的路径.通常它是".",有时它是项目所在的文件夹,有时它是".."或"..\..",它似乎不好指向上面的文件夹解决方案文件 相对化的是从该文件夹到项目文件的路径.如果SccLocalPath指向项目的文件夹,它将完全丢失.如果SccLocalPath中包含"..",则此路径可能包含分支之间不同的文件夹名称,我认为这会导致问题.
所以,最后要了解我想知道的细节:
2012年6月添加: 我不再使用Perforce了,所以我不能保证它,但请看下面的KCD答案.显然有一个新的P4 VS插件正在开发中.希望它能清除所有这些混乱!
不要将可变类型的实例分配给只读字段.
使用可变类型创建的对象可以在创建后进行修改.例如,数组和大多数集合是可变类型,而Int32,Uri和String是不可变类型.对于包含可变引用类型的字段,只读修饰符可防止字段值被覆盖但不保护可变类型不被修改.
这简单地重述了readonly的行为,但没有解释为什么使用readonly是不好的.其含义似乎是许多人不理解"只读"的含义,并错误地认为只读字段是不可改变的.实际上,它建议使用"readonly"作为代码文档,指示深层不变性 - 尽管编译器无法强制执行此操作 - 并且禁止将其用于其正常功能:确保字段的值在之后不会发生变化对象已经构建.
我对使用"readonly"来表示除编译器理解的正常含义之外的其他内容感到不安.我觉得它鼓励人们误解"只读"的含义,并且期望它意味着代码作者可能不想要的东西.我觉得它排除了在可能有用的地方使用它 - 例如,表明两个可变对象之间的某些关系在其中一个对象的生命周期内保持不变.假设读者不理解"只读"的含义这一概念似乎与微软的其他建议相矛盾,例如FxCop的"不要初始化不必要"规则,该规则假定您的代码的读者是该语言的专家并且应该知道(例如)bool字段被自动初始化为false,并且阻止您提供显示"是,这已被有意识地设置为false的冗余;我不会忘记初始化它".
那么,首先,为什么Microsoft建议不要使用readonly来引用可变类型?我也有兴趣知道:
我正在尝试使用几何着色器将点膨胀成四边形以进行一些简单的2D渲染.大多数帧的渲染完全符合我的预期,但每隔一段时间渲染一些顶点都会使其属性不正确.我花了一些时间从一个包含许多移动部件的更大程序中简化这个,所以我在渲染过程中做了最低限度,但不幸的是仍然有很多设置.完整的代码在这里:
#!/usr/bin/env python
# Copyright 2011-2013, Andrew Wilson
# Licensed under the MIT license:
# http://www.opensource.org/licenses/MIT
# memglitch.py
from OpenGL import GL
import sys
import pygame
import pygame.image
import pygame.key
import pygame as PG
import numpy
import hashlib
import collections
import ctypes
######## SHADERS ########
vertex_shader = '''\
#version 330
uniform vec2 screen_dimensions;
uniform vec2 cam_position;
uniform float zoom;
layout(location=0) in vec2 position;
layout(location=1) in vec2 size;
layout(location=2) in vec2 other;
out VertexData
{
vec2 position;
vec2 size;
float …Run Code Online (Sandbox Code Playgroud) 我想提供一个类来管理创建和随后删除临时目录.理想情况下,我希望它可以在using块中使用,以确保无论我们如何离开块,都会再次删除目录:
static void DoSomethingThatNeedsATemporaryDirectory()
{
using (var tempDir = new TemporaryDirectory())
{
// Use the directory here...
File.WriteAllText(Path.Combine(tempDir.Path, "example.txt"), "foo\nbar\nbaz\n");
// ...
if (SomeCondition)
{
return;
}
if (SomethingIsWrong)
{
throw new Exception("This is an example of something going wrong.");
}
}
// Regardless of whether we leave the using block via the return,
// by throwing and exception or just normally dropping out the end,
// the directory gets deleted by TemporaryDirectory.Dispose.
}
Run Code Online (Sandbox Code Playgroud)
创建目录没问题.问题是如何编写Dispose方法.当我们尝试删除目录时,我们可能会失败; 例如,因为我们仍然在其中打开一个文件.但是,如果我们允许传播异常,它可能会掩盖使用块内发生的异常.特别是,如果在使用块内发生异常,则可能是导致我们无法删除目录的异常,但如果我们屏蔽它,则我们丢失了解决问题的最有用信息.
看来我们有四种选择:
我有一个应用程序A,我希望能够在配置文件中调用用户指定的任意其他进程.
批处理脚本B是用户希望由A调用的一个这样的过程.B设置一些环境变量,显示一些消息并调用编译器C来完成一些工作.
Windows是否为任意进程提供了一种标准的方式来彻底终止?假设A在控制台中运行并接收CTRL + C. 它可以传递给B和C吗?假设A在窗口中运行并且用户试图关闭窗口,它可以取消B和C吗?
TerminateProcess是一个选项,但不是一个很好的选项.如果A在B上使用TerminateProcess,则C继续运行.如果C长时间运行,这可能会导致令人讨厌的问题,因为我们可能会启动另一个C实例来操作相同的文件,而C的第一个实例仍在秘密工作.此外,TerminateProcess不会导致干净的退出.
GenerateConsoleCtrlEvent听起来不错,并且可以在控制台中运行所有内容时工作,但文档说您只能将CTRL + C发送到您自己的控制台,因此如果A在窗口中运行则无济于事.
在Windows上是否有任何等效的SIGINT?我很想找到像这样的文章:http://www.cons.org/cracauer/sigint.html for Windows.
我经常发现我想在C#中编写类似这样的代码,但我对标识符名称感到不舒服:
public class Car
{
private Engine engine;
public Engine Engine
{
get
{
return engine;
}
set
{
engine = value;
}
}
public Car(Engine engine)
{
this.engine = engine;
}
}
Run Code Online (Sandbox Code Playgroud)
这里我们有四种不同的东西叫做"引擎":
Engine班级.引擎似乎是一个好的,自然的名字.Engine公共财产.似乎很傻把它称为MyEngine或TheCarsEngine.engine支持财产的私人领域.一些命名方案将推荐m_engine或_engine,但其他人说应该避免所有前缀.engine构造函数上的参数名称.我已经看到了命名方案,建议在所有参数上加上下划线,例如_engine.我真的不喜欢这个,因为调用者可以通过Intellisense看到参数.我不喜欢写的代码的特定事情是:
this.engine = Engine;看起来每个名字都是孤立的,但它们一起是坏的.有什么东西要屈服,但是什么呢?我更喜欢更改私有字段,因为它对用户不可见,所以我通常最终会m_engine解决一些问题,但会引入一个前缀并且不会阻止Intellisense更改engine为Engine.
你会如何重命名这四个项目?为什么?
(注意:我意识到这个例子中的属性可能是一个自动属性.我只是不想让这个例子过于复杂.)
另请参阅: 使用不同于其类型的变量名称,我是不道德的?
在vim中,我可以设置textwidth选项,然后将新文本格式化为wrap.我也可以使用"gq"命令来显式包装文本.但是,使用项目符号列表的行为对我来说有点意外.vim文档讨论了使用带有连字符的项目符号的项目符号列表.当我尝试这样做时,它开始没问题:
- This is a bulleted list item that
has been wrapped. It looks good.
Run Code Online (Sandbox Code Playgroud)
但是,如果我继续第三行,它会放弃缩进:
- This is a bulleted list item that
has been wrapped over more than
two lines. The indentation for lines
after the second is unexpected.
Run Code Online (Sandbox Code Playgroud)
这发生在:
formatoptions=tcq
comments=s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,我想这样缩进:
- This is a bulleted list item that
has been wrapped over more than
two lines. I want every line after
the first to get the same indent.
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ggplot绘制一个比较两个变量的绝对值的图表,并显示它们之间的比率.由于比率是无单位且值不是,我不能在同一个y轴上显示它们,所以我想垂直堆叠为两个单独的图形,对齐的x轴.
这是我到目前为止所得到的:

library(ggplot2)
library(dplyr)
library(gridExtra)
# Prepare some sample data.
results <- data.frame(index=(1:20))
results$control <- 50 * results$index
results$value <- results$index * 50 + 2.5*results$index^2 - results$index^3 / 8
results$ratio <- results$value / results$control
# Plot absolute values
plot_values <- ggplot(results, aes(x=index)) +
geom_point(aes(y=value, color="value")) +
geom_point(aes(y=control, color="control"))
# Plot ratios between values
plot_ratios <- ggplot(results, aes(x=index, y=ratio)) +
geom_point()
# Arrange the two plots above each other
grid.arrange(plot_values, plot_ratios, ncol=1, nrow=2)
Run Code Online (Sandbox Code Playgroud)
最大的问题是第一个图右侧的图例使其大小不同.一个小问题是我不想在顶部的图上显示x轴名称和刻度线,以避免混乱并清楚地表明它们共享同一个轴.
我看过这个问题及其答案:
不幸的是,这两个答案都不适合我.刻面似乎不太合适,因为我希望我的两个图形具有完全不同的y刻度.操纵ggplot_gtable返回的维度似乎更有希望,但我不知道如何解决这两个图表具有不同数量的单元格的事实.天真复制该代码似乎不会改变我的案例的结果图维度.
这是另一个类似的问题:
问题本身似乎提出了一个很好的选择,但是如果表格的列数不同,则rbind.gtable会抱怨,这就是传说中的情况.也许有一种方法可以插入第二个表中的额外空列?或者一种方法来抑制第一个图形中的图例,然后将其重新添加到组合图形中?
从p4v调用p4merge时,它会将库路径显示为文件上的标签.我想使用p4merge作为SVN的差异查看器,为此我有这个批处理文件:
@echo off
pause
p4merge %6 %7
Run Code Online (Sandbox Code Playgroud)
这样可行,但左侧和右侧面板上显示的标签是SVN为p4merge提供的临时文件的名称.SVN传递给批处理文件的参数%3和%5分别包含左侧和右侧面板的相应标签.我确信我记得有命令行参数来设置你想要在每个面板上显示的标签,但它们没有列出p4merge -h.这些是什么?
我(仅)安装了Visual Studio 2010.我正在尝试从命令行构建系统运行我的单元测试.我的所有开发工作都在我使用Samba共享的Linux服务器上的主目录中.当我尝试运行NUnit时,我收到如下错误:
Unhandled Exception: System.TypeInitializationException: The type initializer for 'NUnit.ConsoleRunner.Runner' threw an exception. ---> System.Security.Security
Exception: That assembly does not allow partially trusted callers.
at NUnit.ConsoleRunner.Runner..cctor()
The action that failed was:
LinkDemand
The assembly or AppDomain that failed was:
nunit-console-runner, Version=2.5.9.10305, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77
The method that caused the failure was:
NUnit.Core.Logger GetLogger(System.Type)
The Zone of the assembly that failed was:
Intranet
The Url of the assembly that failed was:
file:///Z:/gitrepos/smarties/dependencies/Windows-x86/NUnit-2.5.9.10305/bin/net-2.0/lib/nunit-console-runner.DLL
--- End of inner exception stack trace ---
at …Run Code Online (Sandbox Code Playgroud)