小编Yip*_*Yay的帖子

.NET运行时序列化

有人可以解释从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方式).

显然,我当前的检查仅处理第二种情况,那么如何让它处理它们呢?

c# serialization interface

5
推荐指数
1
解决办法
1620
查看次数

C#泛型问题 - 通用接口约束

假设我有一些基本接口是泛型驱动的:

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>?有什么方法可以解决这个问题吗?

c# generics

5
推荐指数
1
解决办法
433
查看次数

C# - 流问题

当我编写一些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# c++ stream

5
推荐指数
1
解决办法
891
查看次数

C#懒惰问题

什么是设计应用,有力地依靠懒评价中常用的方法C#(LINQ,IEnumerable,IQueryable,...)?

现在我通常尝试使用yield returnLINQ查询尽可能地使每个查询变得懒惰,但是在运行时这通常会导致"过于懒惰"的行为,当每个查询从它开始构建时显然会导致严重的视觉性能下降.

我通常做的是将ToList()投影操作员放在某处缓存数据,但我怀疑这种方法可能不正确.

从一开始就设计这种应用程序的适当/常用方法是什么?

c# linq

5
推荐指数
1
解决办法
1009
查看次数

C#线程数

什么是来设置适当的方式ThreadPoolC#

ThreadPool.SetMaxThreads(int workerThreads, int completionPortThreads)
Run Code Online (Sandbox Code Playgroud)

我希望线程数等于处理器核心数,但我不确定异步I/O线程(第二个参数).

我可以简单地说出ThreadPool.SetMaxThreads(Environment.ProcessorCount, 0)O/S推断第二个参数本身吗?

c# parameters multithreading threadpool

5
推荐指数
1
解决办法
2469
查看次数

C#如何设置自动属性的默认值?

我有一些实现该接口的接口和类:

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# interface default-value

5
推荐指数
1
解决办法
8331
查看次数

C#字符串翻译

是否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# (从头开始)构建的应用程序是否存在一些通用的内部化方法?

c# string translation internationalization

5
推荐指数
1
解决办法
7420
查看次数

在列表上调用'del'

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 ldel l[:]陈述之间有什么区别?

python list del

5
推荐指数
1
解决办法
1115
查看次数

unsigned char 和 char 指针之间的区别

我对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())对我来说似乎无效,是真的吗?

  • 有什么方法可以使所有这些代码更容易理解和维护?

c++ byte atl char unsigned-char

5
推荐指数
1
解决办法
3230
查看次数

处理 ImageList

处理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# idisposable imagelist winforms

5
推荐指数
1
解决办法
3211
查看次数