小编Kum*_*mba的帖子

在没有选中/取消选中关键字支持的情况下覆盖VB中的GetHashCode?

所以我试图弄清楚如何GetHashCode()在VB中正确覆盖大量的自定义对象.一些搜索引导我得到这个美妙的答案.

除了有一个问题:VB缺少.NET 4.0中的checkedunchecked关键字.据我所知,无论如何.因此,使用乔恩斯基特的实现,我想对具有三个主要成员一个相当简单的类创建这样一个覆盖:Name As String,Value As Int32,和[Type] As System.Type.因此,我提出:

Public Overrides Function GetHashCode() As Int32
    Dim hash As Int32 = 17

    hash = hash * 23 + _Name.GetHashCode()
    hash = hash * 23 + _Value
    hash = hash * 23 + _Type.GetHashCode()
    Return hash
End Function
Run Code Online (Sandbox Code Playgroud)

问题:即使像这样的简单对象,Int32也太小了.我测试的特定实例将"Name"作为一个简单的5个字符的字符串,并且该哈希值足够接近Int32的上限,当它试图计算哈希值(Value)的第二个字段时,它会溢出.因为我找不到粒度checked/ unchecked支持的VB等价物,所以我无法解决这个问题.

我也不想删除整个项目中的Integer溢出检查.这个东西可能...... 40%完成(我做了,TBH),我有更多的代码要写,所以我需要这些溢出检查很长一段时间.

GetHashCode对于VB和Int32 ,Jon的版本的"安全"版本是什么?或者,.NET 4.0 在某个地方有checked/ unchecked我在MSDN上很难找到吗?


编辑:
根据链接的SO问题,最底层的一个不受欢迎的答案提供了一个 …

vb.net gethashcode

24
推荐指数
3
解决办法
7094
查看次数

元类和__slots__?

所以,我正在阅读Python中的元类,以及如何使用type()三参数alter-ego来动态创建类.但是,第三个参数通常是dict初始化要创建的类的__dict__变量.

如果我要动态地创建基于使用一元类类__slots__,而不是__dict__,我怎么可能做到这一点?是type()仍然以某种方式使用覆盖一起__new__()

作为一个FYI,我知道正确的用途__slots__,在创建大量类时节省内存而不是滥用它来强制执行类型安全的形式.


设置__metaclass__和使用以下内容的普通(新式)类的示例__dict__:

class Meta(type):
    def __new__(cls, name, bases, dctn):
        # Do something unique ...
        return type.__new__(cls, name, bases, dctn)

class Foo(object):
    __metaclass__ = Meta

    def __init__(self):
        pass
Run Code Online (Sandbox Code Playgroud)


在上文中,type.__new__()被调用,第四个参数(它成为当实际使用的第三)创建了一个__dict__Foo.但是,如果我想修改Meta包括__slots__,那我也没有字典传递到type()__new__()函数(据我所知-我没有测试过任何这还没有,只是琢磨,并试图找到某种用途 - 情景).

编辑:快速但未经测试的猜测是将值放入__slots__变量并将其传递给变量type.__new__().然后添加一个__init__()to Meta来填充__slots__dict中的变量.虽然,我不确定该dict将如何达到__init__(),因为除非在...中定义了 …

python

15
推荐指数
2
解决办法
2839
查看次数

C宏创建一个掩码 - 可能吗?我找到了一个GCC错误吗?

我有点好奇创建一个宏来为设备寄存器生成位掩码,最高可达64位.这样就BIT_MASK(31)产生了0xffffffff.

但是,有几个C示例不能像我想的那样工作,而是我得到的0x7fffffff.这是因为编译器假设我想要签名输出,而不是无符号输出.所以我尝试了32,并注意到该值回绕到0.这是因为C标准声明如果移位值大于或等于要移位的操作数中的位数,则结果是未定义的.那讲得通.

但是,鉴于以下计划,bits2.c:

#include <stdio.h>

#define BIT_MASK(foo) ((unsigned int)(1 << foo) - 1)

int main()
{
    unsigned int foo;
    char *s = "32";

    foo = atoi(s);
    printf("%d %.8x\n", foo, BIT_MASK(foo));

    foo = 32;
    printf("%d %.8x\n", foo, BIT_MASK(foo));

    return (0);
}
Run Code Online (Sandbox Code Playgroud)


如果我编译gcc -O2 bits2.c -o bits2,并在Linux/x86_64机器上运行它,我得到以下内容:

32 00000000
32 ffffffff
Run Code Online (Sandbox Code Playgroud)


如果我使用相同的代码并在Linux/MIPS(big-endian)机器上编译它,我得到这个:

32 00000000
32 00000000
Run Code Online (Sandbox Code Playgroud)


在x86_64机器上,如果我使用gcc -O0 bits2.c -o bits2,那么我得到:

32 00000000
32 00000000
Run Code Online (Sandbox Code Playgroud)


如果我调整BIT_MASK到 …

c bit-manipulation

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

C字符串中的值查找表?

如果我有一组小字符串值,并且我想获取一个数值来表示它们,那么通过查找表执行此操作的最佳方法是什么?

如果我只需要直接查找,我知道最佳解决方案只是一系列if语句:

if (strcmp(str, "foo") == 0)
    tmp = FOO;
else if (strcmp(str, "bar") == 0)
    tmp = BAR;
Run Code Online (Sandbox Code Playgroud)

但是,我问这个因为这些小字符串值表示我用C编写的小项目中的属性,并且属性可以是只读或读写(现在不是只写,也许永远不会).

所以我目前只是为了确保工作正常,它有一个查找函数,它包含一个if-then子句,用于查找哪些值是只读的,另一个函数用于查找哪些值是读写的.但这对我来说是巨大而丑陋的.

我在想,有三个功能.一个函数是lookup函数,它返回一个int值,该值是字符串的数字形式.但是,此查找函数还可以采用一个标志来确定它是获取只读值还是读取写入值.如果对真正只读的值执行写操作,则该函数将返回-EINVAL(或等效的值).

另外两个函数,现在仍然是读取和写入,只调用此查找函数,传入值的字符串,以及确定它们是用于读取还是写入的标志.

事实上,我不知道这是如何在C中建模的(如果它可以被建模),并且搜索谷歌是令人厌烦的所有内容农场剥离这个地方(并给我C++/C#答案).

所以这就是我认为的样子:

int lookup_func(const char *name, const char *flag) {
    int tmpval = 0;

    /* code to do the lookup. */

    if (tmpval == 0)
        return -EINVAL;
    else
        return tmpval;
}

int get_readonly_bit(const char *name) {
    return lookup_func(name, "ro");
}

int get_readwrite_bit(const char *name) {
    return lookup_func(name, "rw")
}
Run Code Online (Sandbox Code Playgroud)

思考?这个想法是通过不重复这两个函数的if-then分支来减少代码大小,这两个函数在整体设计上略有不同,只是让某种查找函数找出这个值所服务的函数.

c

10
推荐指数
1
解决办法
9902
查看次数

当T是值类型时,更快的方式从String转换为泛型类型?

有没有人知道VB中从字符串到T限制为valuetype(Of T as Structure)的泛型类型的快速方式,当我知道T将始终是某种数字类型?

这对我来说太慢了:

Return DirectCast(Convert.ChangeType(myStr, GetType(T)), T)
Run Code Online (Sandbox Code Playgroud)

但它似乎是从String- > 获得唯一理智的方法T.我已经尝试使用Reflector看看它是如何Convert.ChangeType工作的,虽然我可以通过该代码的黑客版本从String转换为给定的数字类型,但我不知道如何将该类型重新插入,T以便可以返回.

我将添加我所看到的速度惩罚的一部分(在定时循环中)是因为返回值被赋值给一个Nullable(Of T)值.如果我强烈键入我的类为特定的数字类型(即UInt16),那么我可以大大提高性能,但是然后需要为我使用的每个数字类型复制该类.

如果T在通用方法/类中处理转换器时,它几乎是好的.也许有,我忘记了它的存在?


结论:
测试下面提供的三个实现和我原来的DirectCast/ChangeType表单,@ peenut使用预准备委托Parse从基本类型获取方法的方法有效.但是,没有进行错误检查,因此实现者需要记住只将其用于具有Parse可用方法的valuetype .或者扩展下面的内容来进行错误检查.

所有运行都在运行Windows Server 2003 R2和4GB RAM的32位系统上完成.每次"运行"是要测试的方法的1,000,000次执行(ops),使用StopWatch计时并以毫秒为单位报告.

原文DirectCast(Convert.ChangeType(myStr, GetType(T)), T):

1000000 ops: 597ms
Average of 1000000 ops over 10 runs: 472ms
Average of 1000000 ops over 10 runs: 458ms
Average of 1000000 ops over 10 runs: …
Run Code Online (Sandbox Code Playgroud)

vb.net

9
推荐指数
1
解决办法
5409
查看次数

在缩小列宽后强制 Tkinter.ttk Treeview 小部件调整大小

背景

Python-2.7.14 x64,Tk-8.5.15(捆绑)

Tk 中的 Treeview 小部件有很多问题是有据可查的,而 Tkinter 作为一个瘦包装器,并没有做太多处理这些问题。一个常见的问题是让 Treeview 在browse模式下与水平滚动条一起正常工作。设置整个Treeview的宽度需要设置每一列的宽度。但是如果有很多列,这会水平拉伸父容器,并且不会激活水平滚动条。

我找到的解决方案是,在设计时,将每一列设置width为所需的大小,并将该值缓存在安全的地方。当您添加,编辑或删除行,你需要步行列和查询其当前宽度值,如果它比你的缓存宽度,设置width回原来的缓存值,并且设置minwidth为当前列宽。最后一列也需要将其stretch属性设置为“True”,因此它可以消耗剩余的任何剩余空间。这将激活水平滚动条并允许它适当地平移 Treeview 的内容,而无需更改整个小部件的宽度。

警告:在某些时候,Tk的内部复位width等于minwidth,但并没有强制重绘的时候了。稍后当您更改小部件时会感到惊讶,例如添加或删除一行,因此每次更改小部件时都必须重复上述操作。如果您捕获所有可能发生重绘的地方,这并不是一个真正的大问题。


问题

更改 Ttk 样式的属性会触发整个应用程序的强制重绘,因此会弹出我上面提到的警告,Treeview 小部件水平扩展,水平滚动条停用。


演练

下面的代码演示了:

# imports
from Tkinter import *
from ttk import *
from tkFont import *

# root
root=Tk()

# font config
ff10=Font(family="Consolas", size=10)
ff10b=Font(family="Consolas", size=10, weight=BOLD)

# style config
s=Style()
s.configure("Foo2.Treeview", font=ff10, padding=1)
s.configure("Foo2.Treeview.Heading", font=ff10b, padding=1)

# init a …
Run Code Online (Sandbox Code Playgroud)

python tkinter

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

是'With ... End With'真的更有效率吗?

所以我正在玩ILDASM,并注意到一个奇怪的是我在Google上找不到一个非常好的解释.

似乎在VB.NET中使用With块时,得到的MSIL大于w/o.所以这让我想问,With Blocks真的更有效吗?MSIL是JIT到本机机器代码的东西,所以较小的代码大小应该意味着更高效的代码,对吧?

这是两个类(Class2和Class3)的示例,它们为Class1的实例设置相同的值.Class2没有With块,而Class3使用With.Class1有六个属性,涉及6个私有成员.每个成员都是特定的数据类型,它都是此测试用例的一部分.

Friend Class Class2
    Friend Sub New()
        Dim c1 As New Class1

        c1.One = "foobar"
        c1.Two = 23009
        c1.Three = 3987231665
        c1.Four = 2874090071765301873
        c1.Five = 3.1415973801462975
        c1.Six = "a"c
    End Sub
End Class

Friend Class Class3
    Friend Sub New()
        Dim c1 As New Class1

        With c1
            .One = "foobar"
            .Two = 23009
            .Three = 3987231665
            .Four = 2874090071765301873
            .Five = 3.1415973801462975
            .Six = "a"c
        End With
    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

这是Class2的结果MSIL:

.method assembly specialname rtspecialname 
        instance …
Run Code Online (Sandbox Code Playgroud)

vb.net cil

4
推荐指数
1
解决办法
410
查看次数

.NET 4中是否允许泛型运算符重载?

我假设"不",但我无法找到谷歌的确凿证据来支持这一假设.使用'vb.net'的关键字,泛型运算符重载"'只产生1个结果,删除'重载'会产生更多,但没有直接声明该问题.

我的想法是给出一个抽象类,能够实现一个泛型运算符重载是很棒的,派生类可以在这种情况下使用,当所述运算符重载必须返回派生类的新副本时,代码对于每个重载都是一样的.如果那有意义的话.

这倒是回到我以前在我的自定义枚举类的问题和重载位运算符(And,Or,Not,和Xor),但是,这种特殊的思想是由的"能不能做到?"一个单纯的好奇心提示.

这是我的一个自定义枚举基本上看起来像:
父,EBase没什么特别的,只是托管公共NameValue属性,加上两个共享运算符,op_Equalityop_Inequality.

Friend NotInheritable Class EExample
    Inherits EBase

    Private Sub New()
    End Sub

    Friend Shared Function GetValue(ByVal Name As String) As Enums
        Dim tmpOffset As Int32 = Array.IndexOf(_Names, Name)
        Return If(HasContent(Name), If(tmpOffset <> -1, Values(tmpOffset), Nothing), Nothing)
    End Function


    ' Num of Enums defined.
    Friend Shared ReadOnly MaxEnums As Int32 = 5

    ' String literals.
    Private Shared ReadOnly _Names …
Run Code Online (Sandbox Code Playgroud)

vb.net generics operator-overloading

4
推荐指数
1
解决办法
1005
查看次数

在Python lambda表达式中处理len()中的NoneType?

据我所知,Python lambda只允许表达式,而不是语句.我有一个案例,我len()在lambda表达式中使用并尝试获取函数调用的返回值的长度.但是,该函数调用有可能返回None,这会中断len().这周围有优雅的方式吗?

例:

def foo(obj_list, field):
    return maxk(obj_list, key=lambda obj: len(nested_getattr(obj, field)))
Run Code Online (Sandbox Code Playgroud)

在上面,maxk()是一个max()接受key参数的版本.我正在使用Python 2.4(并且目前不能使用更高的东西),所以我有一个自定义实现max(),需要一个关键参数,来自这里(参见帖子#140122和#140143). nested_getattr()是另一个实用程序函数,其行为类似getattr()但可以获取嵌套在另一个中的属性.这可以从这里获得.

示例函数的作用(这是我用变量/名称改变的实际函数)是通过一个对象列表(obj_list)并比较值的长度field并返回列表field中最大的对象.

但是,如果field为每个对象指定的属性返回None,len()则将使用a阻塞TypeError.我想我可以使用内联条件绕过它,但是我必须调用nested_getattr()两次,一次用于检查,如果返回值不是,则可能第二次None.我宁愿将其返回值缓存到变量并在决定返回什么之前在条件上运行它(或者只是让生成器表达式完全跳过它).

处理这个问题的好方法是什么?我对这个函数的其他实现是开放的maxk(),或者nested_getattr()(如果需要的话).

python lambda python-2.4

0
推荐指数
1
解决办法
1334
查看次数