小编Laz*_*zlo的帖子

来自基类的用户定义的转换运算符

介绍

我知道"不允许在基类之间进行用户定义的转换".作为对此规则的解释,MSDN给出了"您不需要此运算符".

我确实理解不需要用户定义基类的转换,因为这显然是隐式完成的.但是,我确实需要基类转换.

在我目前的设计中,非托管代码的包装器,我使用指针存储在Entity类中.所有使用指针的类都派生自该Entity类,例如Body类.

因此我有:

方法A.

class Entity
{
    IntPtr Pointer;

    Entity(IntPtr pointer)
    {
        this.Pointer = pointer;
    }
}

class Body : Entity
{
    Body(IntPtr pointer) : base(pointer) { }

    explicit operator Body(Entity e)
    {
        return new Body(e.Pointer);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个演员是非法的.(注意,我没有打扰写入访问器).没有它,编译器允许我这样做:

方法B.

(Body)myEntity
...
Run Code Online (Sandbox Code Playgroud)

但是,在运行时,我会得到一个例外,说这个演员是不可能的.

结论

因此,我需要基类进行用户定义的转换,而C#拒绝它给我.使用方法A,编译器会抱怨,但代码在运行时逻辑上可以工作.使用方法B,编译器不会抱怨,但代码在运行时显然会失败.

在这种情况下我觉得奇怪的是,MSDN告诉我我不需要这个运算符,并且编译器就像隐含的一样(方法B).我应该做些什么?

我知道我可以使用:

解决方案A.

class Body : Entity
{
    Body(IntPtr pointer) : base(pointer) { }

    static Body FromEntity(Entity e)
    {
        return new Body(e.Pointer);
    } …
Run Code Online (Sandbox Code Playgroud)

c# casting

64
推荐指数
3
解决办法
2万
查看次数

在玻璃上渲染控件:找到解决方案,需要双缓冲/完善

我(终于!)找到了一种在玻璃上渲染Windows.Forms控件的方法,它似乎没有任何重大缺点,也没有任何大的实现时间.它受到Coded 的这篇文章的启发,它基本上解释了如何本地覆盖控件绘制以绘制它们.

我使用该方法将控件渲染为位图,并使用GDI +和适当的Alpha通道将其绘制回NativeWindow的绘制区域.实现很简单,但可以完善可用性,但这不是这个问题的重点.然而,结果非常令人满意:

在玻璃上的真正文本框

但是,有两个区域需要修复才能真正使用.

  1. 双缓冲,因为这个叠加图像和真实控件之间的闪烁是频繁和可怕的(用代码测试自己).将基本控件设置为双缓冲SetStyles(this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true)不起作用,但我怀疑我们可以通过一些试验和错误使其工作.
  2. 某些控件不起作用.我已经能够完成以下工作:

    • 文本框
    • MaskedComboBox
    • ComboBox(DropDownStyle == DropDownList)
    • 列表框
    • CheckedListBox
    • 列表显示
    • 树视图
    • 的DateTimePicker
    • 的MonthCalendar

    但我不能让这些工作,虽然我不明白为什么不.我有根据的猜测是,实际的NativeWindow句柄我引用了整个控件,而我需要引用它的"输入"(文本)部分,可能是一个孩子.有关如何获取输入窗口句柄的WinAPI专家的任何帮助都是受欢迎的.

    • ComboBox(DropDownStyle!= DropDownList)
    • 的NumericUpDown
    • RichTextBox的

但修复双缓冲将是可用性的主要关注点.

这是一个示例用法:

new GlassControlRenderer(textBox1);
Run Code Online (Sandbox Code Playgroud)

这是代码:

public class GlassControlRenderer : NativeWindow
{
    private Control Control;
    private Bitmap Bitmap;
    private Graphics ControlGraphics;

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case 0xF: // WM_PAINT
            case 0x85: // WM_NCPAINT
            case 0x100: // WM_KEYDOWN
            case 0x200: // WM_MOUSEMOVE
            case 0x201: …
Run Code Online (Sandbox Code Playgroud)

.net c# winapi gdi+ aero

46
推荐指数
1
解决办法
3087
查看次数


如何在Visual Studio 2010(C#Express)中构建版本?

我已经习惯了VS2008,在按下F6或在菜单Build> Build Solution中构建发布版本.

构建菜单已经消失,虽然我可以构建解决方案(通过F6),但它只构建调试.

我假设现在有某种配置管理器,但我无法在任何地方找到它.

release build visual-studio-2010

31
推荐指数
2
解决办法
7万
查看次数

除了允许之外,删除所有HTML标记

我见过很多表达式来删除特定的标签(或多个指定标签),以及一个以删除所有,但一个特定的标签,但我还没有找到一种方法,除了许多排除(即所有除了全部删除p, b, i, u, a, ul, ol, li)在PHP.我对正则表达式很不满意,所以我需要一只手.:) 谢谢!

html php regex tags

31
推荐指数
3
解决办法
6万
查看次数

为什么我在运行时遇到泛型约束违规?

我在尝试创建一个严重依赖于泛型的类的新实例时遇到以下异常:

new TestServer(8888);

System.TypeLoadException

GenericArguments[0], 'TOutPacket', on     
'Library.Net.Relay`4[TInPacket,TOutPacket,TCryptograph,TEndian]' 
violates the constraint of type parameter 'TInPacket'.

at System.RuntimeTypeHandle.Instantiate(RuntimeTypeHandle handle, IntPtr* pInst, Int32 numGenericArgs, ObjectHandleOnStack type)
at System.RuntimeTypeHandle.Instantiate(Type[] inst)
at System.RuntimeType.MakeGenericType(Type[] instantiation)
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么会这样.编译时是否检查了通用约束?

我的谷歌搜索让我得出结论,这与这些原因中的任何一个有关,或者(有时?)两者:

我不准备牺牲的一件事是自我参照模式.我绝对需要它用于特定目的.

但是,我想帮助指出这个问题出现的地点和原因.由于库是庞大的并且产生了巨大的通用模式,我认为最好根据请求逐步提供代码位.

根据要求,再次声明.但我想强调的是,我宁愿一般都知道为什么会发生这样的异常,然后在我的特定代码中自行修复它,而不是为后代找到特定的修复.此外,这将是更长的人分析代码来回答,而不是给一般的解释,为什么泛型类型的限制可以在运行时被侵犯.

执行声明:

class TestServer : Server<TestServer, TestClient, ServerPacket.In, ServerPacket.Out, BlankCryptograph, LittleEndianBitConverter>

class TestClient : AwareClient<TestOperationCode, TestServer, TestClient, ServerPacket.In, ServerPacket.Out, BlankCryptograph, LittleEndianBitConverter>

class ServerPacket
{
    public abstract class In : AwarePacket<TestOperationCode, TestServer, TestClient, ServerPacket.In, ServerPacket.Out, BlankCryptograph, LittleEndianBitConverter>.In
    public class Out : …
Run Code Online (Sandbox Code Playgroud)

.net c# generics runtime type-constraints

23
推荐指数
2
解决办法
7069
查看次数

来自字节数组的字符串不会在C#中被修剪?

我有一个类似于此的字节数组(16字节):

71 77 65 72 74 79 00 00 00 00 00 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)

我用它来将它转换为字符串并修剪结束空格:

ASCIIEncoding.ASCII.GetString(data).Trim();
Run Code Online (Sandbox Code Playgroud)

我得到的字符串很好,但它仍然有所有结束空格.所以我得到类似的东西"qwerty.........."(由于StackOverflow,点是空格).

我究竟做错了什么?

我也尝试使用.TrimEnd()并使用UTF8编码,但它不会改变任何东西.

提前致谢 :)

c# arrays string byte trim

22
推荐指数
3
解决办法
2万
查看次数

什么是.NET中的System.nanoTime()?

这个标题几乎是不言自明的,我正在为这种简单而自杀.

看着这里,但没什么用处.

.net c# java nanotime

18
推荐指数
2
解决办法
2万
查看次数

如何使用驼峰式案例访问属性?

为了与我的编码风格保持一致,我想camelCase用来访问属性而不是snake_case.在没有修改核心框架的情况下,Laravel可以实现这一点吗?如果是这样,怎么样?

例:

// Database column: first_name

echo $user->first_name; // Default Laravel behavior
echo $user->firstName; // Wanted behavior
Run Code Online (Sandbox Code Playgroud)

naming-conventions laravel eloquent

17
推荐指数
3
解决办法
1万
查看次数

为什么类成员的名称不能与其中一个嵌套类相同?

或者为什么以下不可能:

class Material
{
    class Keys
    {
        ...
    }

    Material.Keys Keys { get; set; } // Illegal
}
Run Code Online (Sandbox Code Playgroud)

我没有看到任何可能的歧义.按实例访问时,返回属性.静态访问时,返回类.或者我错过了什么?

我不是要求"修复"(我知道我可以用不同的名称来命名,比如MaterialKeys等),但更多的是这个限制背后的技术原因.

c# conflict properties nested-class

16
推荐指数
3
解决办法
5063
查看次数