有人可以解释从ISerializable界面继承和声明对象之间的区别是[Serializable]什么?
我知道在第一种情况下你必须实现ISerializable接口成员,而在第二种情况下,这项工作可能由C#本身完成.
但是对我来说没有意义的是以下行为:
public void Foo<T>() where T : ISerializable
{
// Whatever
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我有这样的课:
[Serializable]
public class Value
{
public String Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
不幸的是我不能打电话给我X.Foo<Value>(),因为编译器说:
There is no implicit reference conversion from 'Value' to 'System.Runtime.Serialization.ISerializable'
Run Code Online (Sandbox Code Playgroud)
我很确定这是我对一些显而易见的事情的误解,所以请指出我做错了什么.
如何使where T : ISerializable语句也适用于[Serializable]类?有办法吗?
我想要实现的是编译时错误,如果提供的类型T不可序列化(通过使用[Serializable]或ISerializable方式).
显然,我当前的检查仅处理第二种情况,那么如何让它处理它们呢?
假设我有一些基本接口是泛型驱动的:
public interface Inteface<T> {
void Foo(T t);
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个这个接口的具体实现,它也是通用的:
public class InterfaceImpl<T> {
public void Foo(T t) {
// Whatever
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来不错,但现在让我说我有其他课程:
public class Ololo {
public void BadFunction<TShouldModelInterface>(TShouldModelInterface shouldModelInterface) {
// Whatever
}
}
Run Code Online (Sandbox Code Playgroud)
并且假设我想执行检查是否TShouldModelInterface实际实现了任何可能的Interface<T>.
如果界面不是通用的,我会写一些类似的东西where TShouldModelInterface : Interface.
但如果接口是一个declared as Interface<T>?有什么方法可以解决这个问题吗?
当我编写一些I/O例程时C++,我通常会通过操作接口来使其尽可能通用<iostream>.
例如:
void someRoutine(std::istream& stream) { ... }
Run Code Online (Sandbox Code Playgroud)
应如何做同样的事情C#?
我怀疑我可以根据System.IO.TextReader或写出我的惯例System.IO.TextWriter,但我不确定.
显然,我正在寻找一个相同的基类C#,它是通用的std::istream或者std::ostream可以通过多种方式扩展(例如,boost::iostreams扩展std::流).
什么是设计应用,有力地依靠懒评价中常用的方法C#(LINQ,IEnumerable,IQueryable,...)?
现在我通常尝试使用yield return和LINQ查询尽可能地使每个查询变得懒惰,但是在运行时这通常会导致"过于懒惰"的行为,当每个查询从它开始构建时显然会导致严重的视觉性能下降.
我通常做的是将ToList()投影操作员放在某处缓存数据,但我怀疑这种方法可能不正确.
从一开始就设计这种应用程序的适当/常用方法是什么?
什么是来设置适当的方式ThreadPool在C#?
ThreadPool.SetMaxThreads(int workerThreads, int completionPortThreads)
Run Code Online (Sandbox Code Playgroud)
我希望线程数等于处理器核心数,但我不确定异步I/O线程(第二个参数).
我可以简单地说出ThreadPool.SetMaxThreads(Environment.ProcessorCount, 0)O/S推断第二个参数本身吗?
我有一些实现该接口的接口和类:
public interface IWhatever {
bool Value { get; set;}
}
public class Whatever : IWhatever {
public bool Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,是否C#允许在不使用某些支持字段的Value情况下拥有一些默认值?
是否C#提供了一种即时翻译字符串或类似方法的方法?
我现在正在研究一些遗留代码,它有一些像这样的部分:
section.AddParagraph(String.Format("Premise: {0}", currentReport.Tenant.Code));
section.AddParagraph(String.Format("Description: {0}", currentReport.Tenant.Name));
section.AddParagraph();
section.AddParagraph(String.Format("Issued: #{0:D5}", currentReport.Id));
section.AddParagraph(String.Format("Date: {0}", currentReport.Timestamp.ToString(
"dd MMM yyyy", CultureInfo.InvariantCulture)));
section.AddParagraph(String.Format("Time: {0:HH:mm}", currentReport.Timestamp));
Run Code Online (Sandbox Code Playgroud)
所以,我想基于一些替换表(例如,同样)实时地实现这些字符串的转换.Qt
C#已有的东西或使用一些后处理 - 可能PostSharp)?C# (从头开始)构建的应用程序是否存在一些通用的内部化方法?class ToBeDeleted:
def __init__(self, value):
self.value = val
# Whatever...
def __del__(self):
print self.value
l = [ToBeDeleted(i) for i in range(3)]
del l
Run Code Online (Sandbox Code Playgroud)
这打印2, 1, 0.
现在,已删除元素的顺序是在规范中定义的,还是特定于实现的?(或者我可能不了解底层的机制)
例如,输出可以0, 1, 2吗?我意识到2, 1, 0顺序可能是为了避免元素的内存重新分配,同时删除它们,但问题仍然存在.
最后一个 - del l和del l[:]陈述之间有什么区别?
我对unsigned char(也在BYTEWinAPI 中)和char指针之间的差异感到有些困惑。
目前我正在处理一些基于 ATL 的遗留代码,我看到了很多如下所示的表达式:
CAtlArray<BYTE> rawContent;
CALL_THE_FUNCTION_WHICH_FILLS_RAW_CONTENT(rawContent);
return ArrayToUnicodeString(rawContent);
// or return ArrayToAnsiString(rawContent);
Run Code Online (Sandbox Code Playgroud)
现在,实现ArrayToXXString看起来如下:
CStringA ArrayToAnsiString(const CAtlArray<BYTE>& array)
{
CAtlArray<BYTE> copiedArray;
copiedArray.Copy(array);
copiedArray.Add('\0');
// Casting from BYTE* -> LPCSTR (const char*).
return CStringA((LPCSTR)copiedArray.GetData());
}
CStringW ArrayToUnicodeString(const CAtlArray<BYTE>& array)
{
CAtlArray<BYTE> copiedArray;
copiedArray.Copy(array);
copiedArray.Add('\0');
copiedArray.Add('\0');
// Same here.
return CStringW((LPCWSTR)copiedArray.GetData());
}
Run Code Online (Sandbox Code Playgroud)
所以,问题:
对于所有可能的情况,从BYTE*到LPCSTR( const char*)的 C 样式转换是否安全?
将数组数据转换为宽字符串时是否真的需要添加双空终止?
转换例程CStringW((LPCWSTR)copiedArray.GetData())对我来说似乎无效,是真的吗?
有什么方法可以使所有这些代码更容易理解和维护?
处理ImageList对象的适当方法是什么?
假设我有一个private ImageList imageList成员的类。现在,有时我会执行以下代码:
// Basically, lazy initialization.
if (imageList == null)
{
imageList = new ImageList();
Image[] images = Provider.CreateImages(...);
foreach (var image in images)
{
// Does the 'ImageList' perform implicit copying here
// or does it aggregate a reference?
imageList.Images.Add(image);
// Do I need to do this?
//image.Dispose();
}
}
return imageList;
Run Code Online (Sandbox Code Playgroud)
在同一个类中,我有Dispose方法实现,其执行方式如下:
public void Dispose()
{
if (!disposed)
{
// Is this enough?
if (imageList != null)
imageList.Dispose();
disposed = …Run Code Online (Sandbox Code Playgroud) c# ×8
c++ ×2
interface ×2
atl ×1
byte ×1
char ×1
del ×1
generics ×1
idisposable ×1
imagelist ×1
linq ×1
list ×1
parameters ×1
python ×1
stream ×1
string ×1
threadpool ×1
translation ×1
winforms ×1