由于永远不会声明@A,因此sql server应该抛出错误,但事实并非如此.这是为什么?
DECLARE @i int = 1;
IF @i > 10
BEGIN
DECLARE @A int = 100;
END
PRINT @A; // doesn't return any result
Run Code Online (Sandbox Code Playgroud)
感谢名单
一个)
string s = "value";
string s1 = "value";
Run Code Online (Sandbox Code Playgroud)
s和s1引用变量是否指向相同的字符串对象(我假设这是因为字符串是不可变的)?
b)我意识到已经重新定义了相等运算符(==,> etc)来比较字符串对象的值,但是在使用静态方法Object.Equals()和Object.ReferenceEquals()比较两个字符串时是否相同?
感谢名单
我能够分配的方法M,以委托对象d与不太具体参数类型,但是当我想用相同的签名方法分配一个匿名方法M来d,我得到一个错误.
这是为什么?
class derivedEventArgs : EventArgs { }
delegate void newDelegate(object o, derivedEventArgs e);
static void Main(string[] args)
{
newDelegate d = M; // ok
d = (object o, EventArgs e) => { }; // error
}
public static void M(object o, EventArgs e) { }
Run Code Online (Sandbox Code Playgroud) 我知道如何在我的应用程序中使用锁,但是我对锁定还不太了解(BTW - 我知道lock语句只是使用Monitor类类型的简写符号).
来自http://msdn.microsoft.com/en-us/library/ms173179.aspx:
public class TestThreading
{
private System.Object lockThis = new System.Object();
public void Function()
{
lock (lockThis)
{
// Access thread-sensitive resources.
}
}
}
Run Code Online (Sandbox Code Playgroud)
提供给lock关键字的参数必须是基于引用类型的对象,并用于定义锁的范围.在上面的示例中,锁定范围仅限于此函数,因为在函数外部不存在对象lockThis的引用.如果确实存在这样的引用,则锁定范围将扩展到该对象.
a)我不明白lockThis对象如何定义锁的范围.锁的范围是锁(lockThis){和相邻}之间的所有代码,那么"锁定范围将扩展到该对象"究竟是什么意思?
b)术语锁定对象锁定 是什么意思?只是我们使用lockThis的引用来锁定代码区域?因此,该术语并不表示我们锁定了lockThis这个对象?
感谢名单
回复David Morton:
如果我的答复有点冗长,我道歉,但我想不出任何其他方式来表达我的问题,仍然有点连贯:
- 在这种情况下,锁的范围是类本身的单个实例.这与跨越特定类的所有实例相反.你可以通过使lockThis静态来锁定所有实例TestThreading.这就是锁的"范围"的含义:它是适用于单个实例,还是适用于特定类型的每个实例.
其他对象仍然可以从另一个线程访问lockThis,但是它们无法处理被该对象上的锁包围的代码.
如果我们调用由lock(位于TestThreading.Function内)C包围的代码,那么由于TestThreading.Function不是静态的,每个TestThreading实例都有自己的C副本.但是如果TestThreading.Function是静态的,那么所有TestThreading实例都将共享相同的C副本.作为类比,如果C是一个房间,如果TestThreading.Function不是静态的,那么每个TestThreading实例都有自己的C空间,但如果函数是静态的,那么所有TestThreading实例将共享相同的C空间.
按照这个类比,我将lockThis解释为C室 …
我理解代表和事件是如何工作的.我还可以想象一些我们应该实现事件的常见场景,但是我很难理解在什么情况下应该使用委托.
感谢名单
回复用户KVB的帖子:
一个)
您基本上可以使用委托,否则您将使用单方法接口.
我想我有点理解以下内容:
C类可以定义方法CM,它将接口IM作为参数.此接口将定义IM.A方法,因此任何想要调用CM的人都需要实现此接口.
或者,方法CM可以将(而不是接口IM)作为具有与方法IM.A相同的签名的委托D作为参数.
但我不明白的是,为什么不能CM也为它的参数使用委托d即使我们的接口IM 定义的方法之外其他几种方法一?因此,C类的其他方法可能需要接口IM作为其参数,但CM可能需要委托D(假设CM只需要调用方法A而不是IM中定义的任何其他方法)?
b)
var list = new List<int>(new[] { 1, 2, 3 });
var item = list.Find(i => i % 2 == 0);
Run Code Online (Sandbox Code Playgroud)
上面的代码是用户jpbochi调用(参见hers /他在这个帖子中的帖子)依赖注入的例子吗?
我假设上面的代码无法使用事件而不是"纯"代理实现?
后增量++运算符的优先级高于preincrement ++运算符是什么意思?因此,是否存在与++ x具有相同优先级的x ++会导致表达式返回错误结果的情况?
从C#深入:
并非所有lambda表达式都可以转换为表达式树.您不能将带有语句块的lambda(甚至只是一个return语句)转换为表达式树 - >它必须采用仅评估单个表达式的形式.
由于Linq-to-Object语句不会转换为表达式树对象,因此与Linq-to-Object运算符一起使用的lambda表达式可以包含一个语句块
string[] count = { "one ", "two ", "three ", "four ", "five ", "six " };
IEnumerable<int> result = count.Select(item =>
{
Console.WriteLine(item);
return item.Length;
});
foreach (int i in result);
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
one two three four five six
Run Code Online (Sandbox Code Playgroud)
我还没有开始学习Linq-To-Sql或Linq-To-Entities,但我认为用于LINQ语句的lambda表达式IQueryable<T>只能包含一个表达式,因为只有一个表达式可以被转换进入表达树?
谢谢
我了解如何根据Net Framework指南使用事件,但使用此模式有什么好处?
http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx:
.NET Framework准则指出用于事件的委托类型应该采用两个参数,一个"对象源"参数指示事件的来源,一个"e"参数封装有关该事件的任何其他信息."e"参数的类型应该来自EventArgs类.对于不使用任何其他信息的事件,.NET Framework已经定义了适当的委托类型:EventHandler.
a)我看到使用"对象源"值作为第一个参数的一些好处,因为有些情况下多个对象可以将它们的事件设置为相同的方法.因此,例如,如果我们有10个对象,并且如果所有10个对象将它们的事件设置为事件处理程序M,那么在M内部我们可以使用"object sender"参数值来标识事件调用的发起者.
b)根据Net Framework准则使用事件是否还有其他好处?
c)无论可能带来什么好处,为什么他们会超越必须的麻烦
谢谢
当您调用委托对象的BeginInvoke时,系统会创建AsyncResult类型的对象,但BeginInvoke会返回IAsyncResult类型的引用(指向AsyncResult实例).为什么BeginInvoke不返回AsyncResult类型的引用?
感谢名单
如果查询/子查询没有找到任何匹配的行,那么它要么返回 NULL,要么根本不返回任何值,因此甚至不是 NULL 值。基于什么标准,查询/子查询返回 NULL,何时返回任何结果,甚至不返回 NULL 值?
当找不到匹配的行时,标量子查询是否总是返回 NULL?\n 我假设如果没有找到行,最外层标量查询也会返回\nNULL?
SELECT FirstName, LastName, YEAR(BirthDate)\nFROM Persons\nWHERE YEAR(BirthDate) IN (SELECT YearReleased FROM Albums);\nRun Code Online (Sandbox Code Playgroud)\n\n如果子查询没有找到结果,则外部查询的 WHERE 子句是否会翻译为WHERE YEAR(BirthDate) IN (null);?
如果 WHERE 子句被翻译成WHERE YEAR(BirthDate) IN();相反,\xe2\x80\x99t 不应该是一个错误条件,因为YEAR(BirthDate)值如何与空进行比较?