小编zdi*_*ion的帖子

更改VSPS的类别名称

我目前正在使用新的Visual Studio Project System Extensibility库来实现VS2015的新项目类型.我想要做的是更改该类型项目的"类别"的名称.我希望它是"Visual Basic 6".问题是,当我使用"项目类型"模板创建一个包时,它会要求我显示一个名称(我设置为"Visual Basic 6")和一个命名空间名称(我设置为VB6),但当我启动VS实验配置单元(使用默认模板代码),项目模板名称为"Visual Basic 6 Project",但左侧的类别为"VB6".我尝试更改.vstemplate文件的行

<ProjectType>VB6</ProjectType>
Run Code Online (Sandbox Code Playgroud)

<ProjectType>Visual Basic 6</ProjectType>
Run Code Online (Sandbox Code Playgroud)

但如果我这样做,那么模板就不会出现在"新建项目"窗口中.我还尝试在MyUnconfiguredProject.cs文件中更改Language和UniqueCapability常量的值,但它不会更改任何内容.如果我更改了ProjectType值,模板将消失.我注意到类别名称实际上是命名空间名称(而不是"显示名称",为什么?),所以如果我放了VisualBasic6它可以工作,但我不能放空格.我怎么能把这个类别变成"Visual Basic 6"

c# project-types vspackage visual-studio visual-studio-2015

9
推荐指数
1
解决办法
178
查看次数

使用memcmp比较两个不相关的指针是UB吗?

对两个不相关的指针(即不指向同一数组或对象的两个指针)执行算术比较是 C 中未定义的行为。

\n
int a, b;\nbool ub = &a < &b;\n
Run Code Online (Sandbox Code Playgroud)\n

然而,人们可以将它们投射到uintptr_t

\n
int a, b;\nbool not_ub = (uintptr_t)&a < (uintptr_t)&b;\n
Run Code Online (Sandbox Code Playgroud)\n

演员表已定义,比较也已定义。

\n

但是,使用 比较两个指针是否是UB memcmp

\n
int a, b;\nint* pa = &a;\nint* pb = &b;\nint maybe_ub = memcmp(&pa, &pb, sizeof(int*));\n
Run Code Online (Sandbox Code Playgroud)\n

C11 \xc2\xa77.24.4.1 说:

\n
\n

memcmp 函数将 s1 指向的对象的前 n 个字符与 s2 指向的对象的前 n 个字符进行比较。

\n
\n

我对该摘录的理解是比较的是指针的表示,而不是指针本身。因此,我希望调用不会memcmp表现出任何未定义的行为。

\n

由于标准没有指定对象如何存储或表示(特定情况除外,但不是这里),我对结果不感兴趣memcmp不感兴趣,而只是关心它是否是 UB。

\n

c undefined-behavior language-lawyer

5
推荐指数
1
解决办法
195
查看次数

为什么C#中的锯齿状数组以相反的方式定义?

假设我有一个名为的类型T.现在让我们说我做了一个类型的数组T,它给了我T[].在代码中,它给出:

var myArray = new T[10];
Run Code Online (Sandbox Code Playgroud)

长度为10.因此,我们可以看到这使得一个包含10个类型项的数组T.如果T是,或任何标准int,这是有效的.但是,假设是一个数组类型,就像或.stringBinaryWriterTint[]string[]

然后,如果我们想要定义一个包含10个type T(int[])项的数组,它应该给出这样的结果:

var myArray = new int[][10];
Run Code Online (Sandbox Code Playgroud)

通过替换Tint[]先前的示例所示.但这会产生语法错误,因为C#中的正确语法是:

var myArray = new int[10][];
Run Code Online (Sandbox Code Playgroud)

如果我们遵循第一个例子的逻辑,那么应该给出一个包含未定义数量的包含10个整数的数组的数组.

这同样适用于锯齿状数组的任何维度:

var myArray = new int[][][10];
Run Code Online (Sandbox Code Playgroud)

是错的,因为语法正确的方法是:

var myArray = new int[10][][];
Run Code Online (Sandbox Code Playgroud)

这不是个人偏好或代码风格的争论,而只是逻辑:当我们定义数组类型数组时,为什么语法不同于我们定义其他任何数组的数组?

c# language-design

4
推荐指数
1
解决办法
154
查看次数

更改 C# 应用程序中的“(默认)”ResX 语言

我正在用 C# 制作一个应用程序,其中包含很多表单和其他内容。我想本地化它,所以我使用了VS中集成的本地化功能。该应用程序最初是法语(因为我是),带有英语翻译 RESXes,但现在它与其他一些不会说法语的开发人员一起出现在 Codeplex 上,我想更改应用程序和 RESX 文件中的“默认”语言这样他们就可以在不阅读法语的情况下翻译成其他语言。因为当您在 VS Form Designer 中选择另一种语言时,它会显示默认语言(此处为法语)。我尝试重命名所有文件,但问题是所有表单属性都存储在默认的 RESX(法语)中,因此如果我重命名,它将破坏所有内容。是否可以将默认语言更改为英语?

编辑:我认为我需要更精确。该应用程序最初是法语的。然后我将其本地化为英语。现在有一个包含表单属性+原始法语本地化的 MainWindow.resx 和一个仅包含英语本地化的 MainWindow.en-US.resx。因此,如果在设计器中,在“语言”中我选择“(默认)”,它会向我显示 MainWindow.resx 法语,如果我想翻译,它会向我显示法语文本。为了让其他开发人员更容易翻译,我想将 MainWindow.resx 进行英语本地化并创建一个单独的 MainWindow.fr-FR.resx。我还尝试更改AssemblyInfo.cs中的“中性语言”,但没有效果。

.net c# localization resx

3
推荐指数
1
解决办法
1万
查看次数