我开始阅读Jon Skeet的早期访问版本,其中包含有关C#4.0的部分,有一件事让我感到震惊.不幸的是我没有Visual Studio 2010可用,所以我想我只是在这里问一下,看看是否有人知道答案.
如果我有以下代码,现有代码和新代码的混合:
public void SomeMethod(Int32 x, Int32 y) { ... }
public void SomeMethod(Int32 x, Int32 y, Int32 z = 0) { ... }
Run Code Online (Sandbox Code Playgroud)
编译器是否会在定义站点或呼叫站点上抱怨可能的歧义?
例如,这段代码实际上会做什么?
SomeClass sc = new SomeClass();
sc.SomeMethod(15, 23);
Run Code Online (Sandbox Code Playgroud)
它会编译吗?它会调用没有z参数的那个,还是会调用带z参数的那个?
我对以下代码有一些疑问:
using System;
namespace ConsoleApplication2
{
public struct Disposable : IDisposable
{
public void Dispose() { }
}
class Program
{
static void Main(string[] args)
{
using (Test()) { }
}
static Disposable Test()
{
return new Disposable();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
Disposable结构进行操作的using语句是否会从Test()结构框中返回?为了试图找出自己,我检查了上面代码生成的IL,这里是Main(...)方法的IL :
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] valuetype ConsoleApplication2.Disposable CS$3$0000)
L_0000: call valuetype ConsoleApplication2.Disposable ConsoleApplication2.Program::Test()
L_0005: stloc.0
L_0006: …Run Code Online (Sandbox Code Playgroud) 我在SQL查询中获取一些基本发票信息,并在同一查询中计算订单总额和付款总额.这是我到目前为止:
SELECT
orders.billerID,
orders.invoiceDate,
orders.txnID,
orders.bName,
orders.bStreet1,
orders.bStreet2,
orders.bCity,
orders.bState,
orders.bZip,
orders.bCountry,
orders.sName,
orders.sStreet1,
orders.sStreet2,
orders.sCity,
orders.sState,
orders.sZip,
orders.sCountry,
orders.paymentType,
orders.invoiceNotes,
orders.pFee,
orders.shipping,
orders.tax,
orders.reasonCode,
orders.txnType,
orders.customerID,
customers.firstName AS firstName,
customers.lastName AS lastName,
customers.businessName AS businessName,
orderStatus.statusName AS orderStatus,
SUM((orderItems.itemPrice * orderItems.itemQuantity))
+ orders.shipping + orders.tax AS orderTotal,
SUM(payments.amount) AS totalPayments <-- this sum
FROM
orders
LEFT JOIN customers ON orders.customerID = customers.id
LEFT JOIN orderStatus ON orders.orderStatus = orderStatus.id
LEFT JOIN payments ON payments.orderID = orders.id <-- this join …Run Code Online (Sandbox Code Playgroud) 我是否正确理解.NET XmlIgnoreAttribute,它说:
指示XmlSerializer的Serialize方法不要序列化公共字段或公共读/写属性值.
那:
我问的原因是我用一个带有更多选项的新属性替换了文件中的属性.旧属性是一个简单的布尔属性,新属性是枚举.我已经更改了旧属性,以便将新属性的值转换为布尔值,根据旧属性在添加新属性之前的含义,get和set都已实现.
这允许我通过读取设置新属性的旧属性来静默升级新文件,并在序列化时添加新属性.
但是,我想从新的xml文件中删除旧属性,所以我想知道如果我用它标记它会发生什么[XmlIgnore],旧的xml文件是否仍然正确地反序列化并从文件中读取该属性,或者它会被完全忽略?
如果没有,以下变化会做我想要的吗?
[XmlAttribute("is-list")]
[DefaultValue(false)]
public bool IsList
{
get { return false; }
set {
if (value)
ListHandling = ListHandling.All;
}
}
Run Code Online (Sandbox Code Playgroud)
对于所有新对象,这将返回false,因为我已经指定了默认值,并且如果存在于旧文件中,并且设置为true,则会更改ListHandling属性,这将是重要的新属性.
编辑:经过测试,我已经确认这两种方法似乎都符合我的要求.我会留下这个问题,因为我仍然想知道上面提到的第一个行为是否只是一个实现细节,或者是否可以通过这种方式理解文档.
我尝试通过我的Mercurial包装器库进行简单的提交,使用简单的文本Unicode:æøåÆØÅ作为我的提交消息.这将写入文本文件并使用适当的参数提供给Mercurial:
hg commit --logfile FILE
Run Code Online (Sandbox Code Playgroud)
如果我随后使用TortoiseHg查看存储库,则可以正确再现字符.在控制台上,它们被破坏了:
[C:\Temp] :hg log changeset: 0:6a0911410128 tag: tip user: Lasse V. Karlsen date: Wed Dec 01 21:48:54 2010 +0100 summary: Unicode:?ª???Ñ?å?ÿ?à
如果我将输出重定向hg log到文件,并将其打开,æøåÆØÅ则可以正确再现.
所以,我的问题是:
hg直接将日志写入文件,还是必须重定向标准输出?hg崩溃而不是仅仅破坏输出?或者就是这么简单:
在这个页面上,Scott Hanselman展示了两个来自Micro-ORMs Dapper和Massive的例子,Massive-example引起了我的兴趣,因为我看不出他们如何实现这种语法.
示例如下,我将在几行而不是一行中断它:
var tbl = new Products();
var products = tbl.All(where: "CategoryID = @0 AND UnitPrice > @1",
orderBy: "ProductName", limit: 20, args: 5,20);
^----+---^
|
+-- this
Run Code Online (Sandbox Code Playgroud)
他们是如何实现这种语法的,允许args有多个值?我假设params基于参数,因为这是允许的唯一的事情,但我不明白他们是如何构建允许的方法,因为在我看来我尝试的所有内容最终都抱怨命名参数并修复位置参数的顺序错误.
我尝试了这样的测试方法:
public static void Test(string name, int age, params object[] args)
{
}
Run Code Online (Sandbox Code Playgroud)
然后使用命名参数:
Test(age: 40, name: "Lasse", args: 10, 25);
Run Code Online (Sandbox Code Playgroud)
但我得到的只是:
在指定了所有固定参数后,必须出现命名参数规范
所以很明显这是错误的.此外,我无法在源头看到任何允许这样做但也许我在错误的地方看.
我在这里错过了什么?
所以我有这个ActivityGroup,其中我展示了2个活动.当我正在切换时我希望有这种过渡效果,当前视图向左滑出屏幕,新视图从右侧进入.这是我的切换代码,假设当前视图是viewA:
Intent i = new Intent(this, ViewA.class);
viewB = getLocalActivityManager().startActivity("viewb", i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
setContentView(viewB);
Run Code Online (Sandbox Code Playgroud)
现在当我执行以下操作时,将显示viewB的背景,并且viewB的内容会滑入,这不是我想要的:
Animation animIn = AnimationUtils.loadAnimation(this, R.anim.righttoleftin);
viewB.startAnimation(animIn);
Animation animOut = AnimationUtils.loadAnimation(this, R.anim.righttoleftout);
viewA.startAnimation(animOut);
setContentView(viewB);
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
实际上,上面的确有效.我有一个问题,我认为viewA被显示,而事实并非如此.
我刚刚发现如果我做以下事情:
UIPickerView在我的视图中的按钮然后它还没有选择最后一个项目.
我试图通过在didSelectRow方法被触发时简单地输出到控制台,并且当车轮稳定在最后一个项目时它会触发.
我可以检测到车轮仍然在滚动,这样我可以延迟检查它是否有选定值,直到它稳定下来?
如果重要的是,我正在使用MonoTouch进行编程,但如果您有一个代码示例,我可以很好地阅读Objective-C代码以重新实现它.
我们遇到一些显然以错误的隔离级别执行的数据库代码的问题.在代码的这个特定部分中,它应该以"READ UNCOMMITTED"执行以最小化锁.此时数据不一致是可以的.
但是,代码实际上是使用READ COMMITTED读取的,我们无法弄清楚原因.
这是我们做的:
在断点处,我们向数据库发出以下命令:
select s.session_id, s.transaction_isolation_level, st.text from sys.dm_exec_sessions s
inner join sys.sysprocesses sp on (sp.spid = s.session_id)
CROSS APPLY sys.dm_exec_sql_text(sp.sql_handle) st
Run Code Online (Sandbox Code Playgroud)
这个SQL现在报告了4个池化连接,其中一个是我们的连接,我们可以超越断点来执行我们的SQL,具有以下状态:
53 2 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Run Code Online (Sandbox Code Playgroud)
即.会话53具有隔离级别2(READ COMMITTED),并且在此会话上执行的最后一个SQL是"SET TRANSACTION ..."命令.
怎么会这样?
我们使用SQL事件探查器验证了在我们的.NET代码打开它之前这个连接没有生效,所以它没有从连接池中重用.
然而,通过新的连接,并且在其上执行的唯一和第一个SQL明确告诉它使用READ UNCOMMITTED,连接如何仍然是READ COMMITTED?
我们应该在这看什么?
连接字符串(带有编辑的位)如下所示:
SERVER=hostname;DATABASE=dbname;Integrated Security=false;USER ID=sa;PASSWORD=****;Application Name=appname;Type System Version=SQL Server 2000;Workstation ID=hostname;
Run Code Online (Sandbox Code Playgroud)
连接是正常SqlConnection连接,以正常方式打开.
不幸的是,如果我们编写打开SqlConnection的正常代码,我们就无法重现问题,所以必须有应用程序状态的东西,但是因为SqlProfiler和Sql Server都告诉我们是,所以SQL被执行了,但是没有,我不在乎.
有什么可以影响这个?
完全相同的代码也打开其他连接,即代码执行多次并打开许多连接,因此多个连接最终在池中,但只有第一个连接最终出现此问题.
这是SQL Server 2008 R2,我们也在2012年重现了这个问题.
编辑
好的,还有一些信息.
首先,我们正在启用池化,或者更确切地说,我们没有明确禁用池,也没有将连接字符串弄为"N"池.
但是,此连接是第一个使用此特定连接字符串打开的连接,因此不会从池中检索它.另请参阅我的下面的说明,它永远"生病".
此连接正在设置如下:
var …Run Code Online (Sandbox Code Playgroud) 我有一些构建代理通过TeamCity设置为我们构建.NET代码,我开始怀疑,尽管项目设置,他们是否输出.NET 4.5构建的程序集.我怀疑的是,我不知道Windows 2012 Server是否带有开箱即用的.NET 4.5或4.0,因此它是否只有4.0或任何4.0程序集可用.
如何查看磁盘上的程序集并确定它是使用.NET 4.0还是4.5构建的?
正如显然由Marc Gravell这篇博客,还有的在这些组件是如何建成的差异,尽管我们可能无法实际使用任何.NET 4.5组件/特别功能.
我尝试在程序集上使用ILDASM,但是已知的.NET 4.5(.1)控制台应用程序上的元数据引用仍然说4.0:
// Metadata version: v4.0.30319
Run Code Online (Sandbox Code Playgroud)
我尝试启动仅安装了.NET 4.0的应用程序Windows 7,然后启动,但是如果只能通过测试所有内容来确定一切是否正常,那么我宁愿再尝试一下,看看它是否内置了正确的版本首先.
这可能吗?
.net ×2
c# ×2
.net-4.0 ×1
.net-4.5 ×1
ambiguity ×1
android ×1
animation ×1
assemblies ×1
boxing ×1
c#-4.0 ×1
idisposable ×1
ios ×1
join ×1
massive ×1
mercurial ×1
overloading ×1
sql ×1
sql-server ×1
struct ×1
sum ×1
transactions ×1
uipickerview ×1
unicode ×1
using ×1
xamarin.ios ×1
xmlignore ×1