创建表本身时如何创建具有特定名称的主键。
我想知道我们是否也可以创建主键作为表名的一部分,同时也为它命名。尽管对所有经验丰富的开发人员来说这看起来很正常,但对许多人来说仍然会让人感到困惑。
我做错了什么?
CREATE TABLE [dbo].[TestTable](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](100) NULL)
GO
ALTER TABLE [dbo].[TestTable] ADD CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
([ID] ASC)
GO
谢谢,马亨德拉
答案 0 :(得分:4)
foreach
枚举实现IEnumerable
,IEnumerable<T>
,IEnumerator
或IEnumerator<T>
的任何对象(或实际上任何其类实现兼容{{1}的对象属性和Current
方法)。 MoveNext()
的语法是:
foreach
foreach (type variable in enumerable) { ... }
是新type
变量的类型。 (如果您已经使用了现有变量,则省略该类型。)
将为枚举中的每个对象执行循环体,迭代变量(此处为variable
)将包含每次迭代的对象。
variable
更通用,并遵循以下模式:
for
这几乎完全等同于:
for (initial-statements; loop-condition; post-iteration-actions) {
body
}
处理数组时可能会看到initial-statements
while (loop-condition) {
body
post-iteration-actions
}
循环,例如:
for
这与以下内容相同:
for (int index = 0; index < array.Length; index++) {
Console.WriteLine(array[index]);
}
(注意,编译器优化使用{
int index = 0;
while (index < array.Length) {
Console.WriteLine(array[index]);
index++;
}
}
数组来使用类似的基于索引的迭代,因为这样更快。所以这三种方法在枚举数组时应该具有相同的性能和运行时语义。)
如果您需要,请提供更多信息:
foreach
实际上只是语法糖,可以很容易地转换为foreach
循环。
while
这实际上意味着:
foreach (object x in y) {
Console.WriteLine(x);
}
除var enumerator = y.GetEnumerator();
try {
object x; // See footnote 1
while (enumerator.MoveNext()) {
x = enumerator.Current;
Console.WriteLine(x);
}
} finally {
((IDisposable)enumerator).Dispose();
}
变量没有名称且对您隐藏之外。
为什么enumerator
存在很明显。今天你在任何地方使用它,否则你将不得不写出这个可怕的详细样板代码。 foreach
为您处理所有事情 - 抓取枚举器,在每次迭代时测试foreach
,提取枚举器的当前值,并在迭代完成后处理枚举器。
1 这个变量实际上是semantically declared inside of the loop, starting with C# 5。这个例子对于C#4和前辈来说是准确的。
答案 1 :(得分:0)
foreach
用于遍历集合,而for
可用于任何目的。
答案 2 :(得分:0)
Foreach使用迭代器,用于使用索引
所以
foreach(var item in myCollection)
{
Console.WriteLine(item);
}
与
for(int i = 0; i< myCollection.Count; i++)
{
Console.WriteLine(myCollection[i]);
}
因此,如果这些是一个名为PrintContent的函数,那么将使用实现IEnumerable的任何东西,另一个参数必须具有count属性和实现以及整数类型的索引器。当你将排序和过滤器放入混合中时,它变得更加有趣,它完全是关于抽象的,PrintContent不需要知道如何实现myCollection,只是myCollection实现了IEnumerable。