这是我的第一个StackOverflow问题,所以要好!:-)
我最近在一些C#源代码中遇到了以下示例:
public IFoo GetFooInstance()
{
#IF DEBUG
return new TestFoo();
#ELSE
return new Foo();
#ENDIF
}
Run Code Online (Sandbox Code Playgroud)
这引出了我这些问题:
将NuGet与多个版本树一起使用的正确/可接受的方式是什么?我们有一个2.12版本的产品,并且它正在不断地工作,生成属于主要数字2的更新版本.与此同时,我们还在3.5版本中积极地使用其他功能集和模式.如果我使用相同的NuGet包ID,默认情况下用户将始终获得3.5版本.
我应该为每个主要项目版本创建不同的包ID吗?
我正在尝试创建一个支持异步调用的WCF服务.我按照我能找到的所有示例和教程,所有这些都有一个同步方法的惯用模式,以及async Begin和End,例如:
[OperationContract(AsyncPattern = false)]
string GetData(int value);
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginGetData(int value, AsyncCallback callback, object asyncState);
string EndGetData(IAsyncResult result);
Run Code Online (Sandbox Code Playgroud)
但是,无论我在客户端执行什么操作,都只会调用同步GetData.Fiddler告诉我,消息总是一样的:
<s:Envelope
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetData
xmlns="http://tempuri.org/"><value>0</value></GetData></s:Body></s:Envelope>
Run Code Online (Sandbox Code Playgroud)
当我删除同步GetData接口时,现在可以正确调用async方法.
这是正常的行为吗?我还应该做些什么来支持方法的同步和异步版本吗?
当我们在资源文件中定义字符串常量而不是在claass中声明为const时,在堆内存占用方面是否有优势?
我有这个转换:
DateTime dateTime;
DateTime.TryParseExact("01/02/2013", "mm/dd/yyyy", null, DateTimeStyles.None, out dateTime);
Run Code Online (Sandbox Code Playgroud)
以下断言失败:
Assert.AreEqual(new DateTime(2013, 1, 2), dateTime);
Run Code Online (Sandbox Code Playgroud)
因为TryParseExact会在datetime中添加一个小时:
Expected: 2013-01-02 00:00:00.000
But was: 2013-01-02 00:01:00.000
Run Code Online (Sandbox Code Playgroud)
这是否与夏令时有关,如果是,这是否意味着我不应该使用DateTimeStyles.None?
只是想获得一些关于主键的意见 - 使用身份/序列号或使用HiLo策略(查询高值并增加应用程序本身的低值)会更好吗?
我正在试验Marshal.AllocHGlobal并发现令人费解的是这段代码不会成功,而是抛出一个OutOfMemory异常:
namespace HAlloc
{
using System;
using System.IO;
using System.Runtime.InteropServices;
class Program
{
static void Main(string[] args)
{
// large file ~ 800MB
string fileName = @"largefile.bin";
FileInfo fileInfo = new FileInfo(fileName);
// allocation succeeds
IntPtr p = Marshal.AllocHGlobal((int)fileInfo.Length);
// OutOfMemory exception thrown here:
Marshal.Copy(File.ReadAllBytes(fileName), 0, p, (int)fileInfo.Length);
Marshal.FreeHGlobal(p);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当AllocHGlobal调用成功时,为什么会获得OutOfMemory?
我试图使用cURL调用ValuesController WebApi控制器(默认情况下创建)"PUT"方法.无论我做什么,发送value ="abc","abc"或"= abc"正如我在POST方法的其他问题中所建议的那样,无济于事.
// PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody]string value)
{
}
Run Code Online (Sandbox Code Playgroud)
我也尝试将Content-Type更改为application/json和application/x-www-form-urlencoded,似乎没什么用.
curl -H -d "=TEST" -X PUT http://localhost:30960/api/values/5
Run Code Online (Sandbox Code Playgroud)
这是ASP.NET 5 Web Api中的错误还是在调用时需要使用不同的格式?
我有一个识别页面坐标的函数,我将它们作为一个返回
Dictionary<int, Collection<Rectangle>> GetDocumentCoordinates(int DocumentId)
Run Code Online (Sandbox Code Playgroud)
但是,稍后我需要有关每个页面的信息 - 如果它已经过验证,页面分辨率是什么,颜色/ bw等等.我可以创建另一个函数并运行与前一个函数几乎相同的结果集并获取该信息.
Dictionary<int, PageInfo> GetDocumentAttributes(int DocumentId)
Run Code Online (Sandbox Code Playgroud)
另一种方法是添加一个ref
参数,这样我就可以获得这些值.
Dictionary<int, Collection<Rectangle>> GetCoordinates(int DocumentId, ref Dictionary<int, PageInfo> PageAttributes)
Run Code Online (Sandbox Code Playgroud)
另一种方法是创建一个包含字典和页面信息的包含类:
class DocumentInfo
{
Dictionary<int, Collection<Rectangle>> Coordinates { get; set;}
Dictionary<int, PageInfo> PageAttributes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后定义:
DocumentInfo GetDocumentInfo(int DocumentId);
Run Code Online (Sandbox Code Playgroud)
我倾向于最后一个选项,但你的见解非常感谢.
我们都知道防止数据库死锁的技术 - 以相同的顺序获取锁等等.但是在某些时候,处于压力下的系统可能只是在这里和那里遭受死锁.我们是否应该接受这一点并始终准备在发生僵局时重试或者应该将僵局视为绝对禁止,并且我们是否应尽一切力量阻止它们?
c# ×5
.net ×1
asp.net-core ×1
asynchronous ×1
database ×1
datetime ×1
function ×1
hilo ×1
identity ×1
nuget ×1
parameters ×1
return-value ×1
sequence ×1
sql ×1
wcf ×1