在我回答这个问题,我提到,我们用UpperCamelCase解析得到不装饰的Description属性的枚举常量的描述,但它是天真的,并没有适用于所有情况.我重温了它,这就是我提出的:
var result = Regex.Replace(camelCasedString,
@"(?<a>(?<!^)[A-Z][a-z])", @" ${a}");
result = Regex.Replace(result,
@"(?<a>[a-z])(?<b>[A-Z0-9])", @"${a} ${b}");
Run Code Online (Sandbox Code Playgroud)
第一次更换寻找一个大写字母,然后是小写字母,除非大写字母是字符串的开始(以避免回去和修剪),并增加了前面的空间.它处理您的基本UpperCamelCase标识符,并领导像FDICInsured这样的全高级缩写词.
第二个替换查找小写字母后跟一个大写字母或数字,并在两者之间插入一个空格.这是处理中间或结尾的首字母缩写词或数字的特别,但通常情况下在标识符(除领先的数字,这通常被禁止C风格的语言反正).
运行一些基本的单元测试,这两者的结合正确分离以下所有标识符:NoDescription,HasLotsOfWords,AAANoDescription,ThisHasTheAcronymABCInTheMiddle,MyTrailingAcronymID,TheNumber3,IDo3Things,IAmAValueWithSingleLetterWords和基本(其中没有任何空格添加).
所以,我首先发布这个与其他可能认为有用的人分享,然后再问两个问题:
任何人都会看到一个符合常见的CamelCase-ish约定的情况,这种情况不会被正确地分成友好的字符串吗?我知道它不会缩略语相邻(FDICFCUAInsured)分开,资产重组"正确"的缩略语驼峰像FdicInsured,或大写lowerCamelCased标识符的第一个字母(但一个很容易补充- result = Regex.Replace(result, "^[a-z]", m=>m.ToString().ToUpper());).还要别的吗?
任何人都可以看到一种方式来做出这样的陈述,或者更优雅吗?我正在寻找组合替换调用,但由于他们对匹配执行两个不同的事情,因此无法使用这两个字符串完成.它们可以组合成一个方法链,在String上使用RegexReplace扩展方法,但任何人都可以想到更好吗?
所以,使用NUnit和RhinoMocks:
//Defines basic behavior of all persistable domain objects
public interface IDomainObject {...}
//defines domain objects specific to the Security DB
public interface ISecurityDomainObject : IDomainObject {...}
//Defines a basic transactional data Repository; there are multiple implementors
//which each close TRest to the interface that defines their DB's domain classes
public interface IRepository<TRest> : IDisposable where TRest:IDomainObject
{
IUnitOfWork BeginUnitOfWork();
void CommitUnitOfWork(IUnitOfWork unitOfWork);
void RollBackUnitOfWork(IUnitOfWork unitOfWork);
void Save<T>(T domainObject, IUnitOfWork unitOfWork) where T : class, TRest;
IQueryable<T> QueryFor<T>(IUnitOfWork unitOfWork) where …Run Code Online (Sandbox Code Playgroud) 最近有几个关于将 ValueType 装箱为对象的问题,特别是它是否在某些情况下发生。
我意识到我不知道的是,“装箱”ValueType(将其视为引用的对象)和简单地通过引用访问它之间有什么区别,例如使用 ref 或 out 关键字(您传递的只是“指针”)?在这两种情况下,该值都位于您可以指向它的某个位置(对于对象来说,它是堆,对于本地范围的 ValueType 来说,它是......到底在哪里?)。
如果我不得不猜测,根据我对 C++ 的了解,我会说它是这样工作的:通过引用访问的 ValueType(假设通过参数关键字)保留在其作用域的调用堆栈级别上,但是“创建了指向堆栈中该变量存储桶的“快捷方式”指针,并成为堆栈下一层的一部分。因为该值已经存储在内存中(甚至可能是 CPU 缓存),所以您不必在堆上实例化新的东西;唯一的新东西是指针,它是它自己的 ValueType (一个 IntPtr),并且本身存储在堆栈中,因此据我所知,它比将某些内容放入堆中更快。
这是正在发生的事情,还是还有其他事情正在发生?
编辑:更清楚:
public void TakesAnObject(Object obj) {...}
public void TakesAnIntValueType(ref int myValue) {...}
public void AnotherIntParameterMethod(out int myValue) {...}
...
//this locally-scoped variable is simply created on the stack.
int myInt = 5;
//Performs boxing; an Object is instantiated in the heap that holds the
//variable value from the stack, and that is passed by ref.
TakesAnObject(myInt);
//Apparently does NOT perform …Run Code Online (Sandbox Code Playgroud) 我有以下.NET代码.其中大部分都是在我被录用之前写的,并且原来的开发者都没有为我们工作.
private void SendTCPMessage(string IpAddress, string Message)
{
...
//original code that fails because the Host entry produced
//has no elements in AddressList.
//IPHostEntry remoteMachineInfo = Dns.GetHostEntry(IpAddress);
//New code that fails when connecting
IPHostEntry remoteMachineInfo;
try
{
remoteMachineInfo = Dns.GetHostEntry(IpAddress);
if (remoteMachineInfo.AddressList.Length == 0)
remoteMachineInfo.AddressList =
new[]
{
new IPAddress(
//Parse the string into the byte array needed by the constructor;
//I double-checked that the correct address is produced
IpAddress.Split('.')
.Select(s => byte.Parse(s))
.ToArray())
};
}
catch (Exception)
{
//caught …Run Code Online (Sandbox Code Playgroud) 基本上,我需要一个使用Web服务API执行的SOQL查询,该查询将返回通常显示在Salesforce Web UI中"帐户"页面的"注释和附件"部分中的所有NoteAndAttachment项目.这不仅包括附加到帐户本身的N&A,还包括附加到与帐户相关的任何案例,机会或联系人的N&A.Salesforce本身似乎没有问题获取该信息,但在SOQL限制和数据模型限制之间,我还没有找到一个令人满意的解决方案.
这是我到目前为止所拥有的:
SELECT Id,
(select Id, Title, IsNote from NotesAndAttachments),
(select Id, Title, IsNote from Contacts.NotesAndAttachments),
(select Id, Title, IsNote from Cases.NotesAndAttachments),
(select Id, Title, IsNote from Opportunities.NotesAndAttachments)
FROM Account a WHERE Id = '{0}'
Run Code Online (Sandbox Code Playgroud)
{0}用于.NET String.Format; 这将是我正在提取记录的帐户ID.此特定查询失败,并出现以下异常:
System.Web.Services.Protocols.SoapException : INVALID_FIELD:
(select Id, Title, IsNote from Contacts.NotesAndAttachments),
^
ERROR at Row:3:Column:48
Didn't understand relationship 'Contacts' in field path. If you are attempting to use a custom relationship, be sure to append the '__r' after the custom relationship name. …Run Code Online (Sandbox Code Playgroud) 我有遗留代码,其属性定义为:
private string name;
public string Name
{
Get { return name;}
Set { name = value;}
}
Run Code Online (Sandbox Code Playgroud)
....
有没有办法可以选择一个完整的类并将其转换为新的速记版本?
public string Name { get; set;}
Run Code Online (Sandbox Code Playgroud) 很长一段时间,我需要放置一个WinForms面板和一个非托管类的实例,它在一个单独的线程中使用它来保持主窗口的响应(SDK有时需要几秒钟才能得到它的意思绘制,当它这样做时,它会阻止UI线程).我实际上需要很多这些(最多32个),但我们现在只讨论一个; 该概念应该能够在必要时多次复制.
我认为我需要做的是启动一个新的线程,它将"新建"一个Panel,然后启动一个与特定内容无关的ApplicationContext,并将其分配给Panel.然后,Panel类应该有一个Dispose()重载,它将结束ApplicationContext,关闭消息泵并终止线程.
我需要知道的是:
所以我有第三方提供的SDK,用于从远程源查看流视频.远程源运行由第三方提供的服务器,用于捕获和存储视频,我可以连接到该服务器并通过SDK获取视频.我通过COM引用SDK,并且连接到服务器,选择视频源等基本的非图形操作都运行得很好.
问题是使用此SDK向用户实际显示视频的主要(唯一)方法是将hWnd(作为int)传递给方法,然后将该视频异步绘制到该窗口的客户区域.据我所知,"窗口"具有GUI窗口的含义,在.NET术语中,它将是具有窗口句柄的任何WinForms控件.就我而言,我正在使用PictureBox控件(用户希望看到的每个feed一个).
问题是我显然不能只将一个托管的PictureBox控件的句柄放到这个SDK方法中,因为当我这样做时,我从非托管线程收到一个AccessViolationException.我正在编写一个用VB 6编写的示例程序(在我的计算机上对着测试服务器工作),它使用VB PictureBox做同样的事情,并且工作正常,但显然无论SDK试图做什么我们不错的安全.NET沙箱对象不能与CLR一起飞行.
救命?我希望我可以提供更多的信息或代码示例,但我不能提供足够的消毒,以便在一般情况下工作,我不能泄露正在使用的SDK.我认为我需要的只是告诉.NET我的引用代码应该被信任,以便在窗口中执行它想要的操作,或者以某种方式将窗口移动到程序的舒适沙箱之外的较少管理的内存空间.
编辑:好的,已经取得了一些进展.我现在验证在给出方法的句柄之前,已使用IsHandleCreated创建了控件的句柄.然而,正如Hans Passant所说,IntPtr不是一个int.那么,我如何在圆孔中安装这个方形钉?我已经尝试了ToInt32()函数和显式转换为(int).即使在为32位架构编译库时,两者都不起作用.我是否会回到第三方并说他们的SDK是一个不允许我传递指针的POS?
c# ×6
.net ×3
winforms ×2
boxing ×1
interop ×1
memory ×1
networking ×1
properties ×1
regex ×1
rhino-mocks ×1
salesforce ×1
sockets ×1
soql ×1
string ×1
web-services ×1