问题列表 - 第25766页

从方法泛型中推断类型

我来自Java背景,我正在从c#中的等价物中寻找以下内容.

public interface Reader {
   <T> T read(Class<? extends T> type);
}
Run Code Online (Sandbox Code Playgroud)

这样我可以执行以下操作,约束参数并推断返回类型.

Cat cat = reader.read(Cat.class);
Dog dog = reader.read(Dog.class);
Run Code Online (Sandbox Code Playgroud)

我希望这样的东西可以在c#中运行,但我不确定它会不会.

public interface Reader {
   T Read<T>();
}
Run Code Online (Sandbox Code Playgroud)

而且这样做.

public class TypeReader : Reader {
   public T Read<T>() {
      Type type = T.GetType();
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

这样的事情在c#中是否可能?

c# java generics

2
推荐指数
1
解决办法
168
查看次数

为什么复制构造函数不在这里?

(我正在使用gcc -O2.)

这似乎是一个简单的机会来消除复制构造函数,因为访问a bar的副本中的字段值没有副作用foo; 但拷贝构造函数调用,因为我得到的输出meep meep!.

#include <iostream>

struct foo {
  foo(): a(5) { }
  foo(const foo& f): a(f.a) { std::cout << "meep meep!\n"; }
  int a;
};

struct bar {
  foo F() const { return f; }
  foo f;
};

int main()
{
  bar b;
  int a = b.F().a;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ optimization constructor

6
推荐指数
1
解决办法
1239
查看次数

如何在SUN上制作gcc以与Linux相同的方式计算浮点数

我有一个项目,我必须用双变量进行一些数学计算.问题是我在SUN Solaris 9和Linux上获得了不同的结果.有很多方法(在这里和其他论坛解释)如何使Linux作为Sun工作,但不是相反.我无法触及Linux代码,所以只有SUN才能改变.有没有办法让SUN像Linux一样行事?

我运行的代码(在两个系统上使用gcc编译):

int hash_func(char *long_id)          
{                                 
    double      product, lnum, gold;
    while (*long_id)
        lnum = lnum * 10.0 + (*long_id++ - '0');
    printf("lnum  => %20.20f\n", lnum);
    lnum = lnum * 10.0E-8;
    printf("lnum  => %20.20f\n", lnum);
    gold = 0.6125423371582974;
    product = lnum * gold;
    printf("product => %20.20f\n", product);
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果输入是339886769243483

Linux中的输出:

lnum  => 339886769243**483**.00000000000000000000

lnum  => 33988676.9243**4829473495483398**

product => 20819503.600158**59827399253845**
Run Code Online (Sandbox Code Playgroud)

在SUN上:

lnum => 339886769243483.00000000000000000000

lnum => 33988676.92434830218553543091

product = 20819503.600158**60199928283691**
Run Code Online (Sandbox Code Playgroud)

注意:结果并不总是不同,而且大多数时候它是相同的.60000中只有10个15位数字有这个问题.

请帮忙!!!

linux floating-point solaris

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

在NSView中创建网格

我目前有一个NSView绘制网格图案(基本上是水平和垂直线的指南),其想法是用户可以更改网格的间距和网格的颜色.

网格的目的是在排列对象时充当用户的指导.除了一个例外,一切正常.当我NSWindow通过拖动调整大小手柄调整大小时,如果我的网格间距特别小(比如10像素).阻力调整大小变得昏昏欲睡.

drawRect的网格代码如下:

-(void)drawRect:(NSRect)dirtyRect {

    NSRect thisViewSize = [self bounds];

    // Set the line color

    [[NSColor colorWithDeviceRed:0 
                           green:(255/255.0) 
                            blue:(255/255.0) 
                           alpha:1] set];

    // Draw the vertical lines first

    NSBezierPath * verticalLinePath = [NSBezierPath bezierPath];

    int gridWidth = thisViewSize.size.width;
    int gridHeight = thisViewSize.size.height;

    int i;

    while (i < gridWidth)
    {
        i = i + [self currentSpacing];

        NSPoint startPoint = {i,0};
        NSPoint endPoint = {i, gridHeight};

        [verticalLinePath setLineWidth:1];
        [verticalLinePath moveToPoint:startPoint];
        [verticalLinePath lineToPoint:endPoint];
        [verticalLinePath stroke];
    }

    // Draw …
Run Code Online (Sandbox Code Playgroud)

grid cocoa objective-c nsview drawrect

6
推荐指数
1
解决办法
4562
查看次数

我如何解决这个lambda表达式外部变量问题?

我正在使用PropertyDescriptor和ICustomTypeDescriptor(仍然)尝试将WPF DataGrid绑定到一个对象,数据存储在一个Dictionary中.

因为如果你向WPF DataGrid传递一个Dictionary对象列表,它将根据字典的公共属性(Comparer,Count,Keys和Values)自动生成列,我的Person子类为Dictionary,并实现ICustomTypeDescriptor.

ICustomTypeDescriptor定义了一个返回PropertyDescriptorCollection的GetProperties方法.

PropertyDescriptor是抽象的,所以你必须将它子类化,我想我有一个构造函数,它接受Func和一个Action参数,它们委托字典中值的获取和设置.

然后我为字典中的每个Key创建一个PersonPropertyDescriptor,如下所示:

            foreach (string s in this.Keys)
            {
                var descriptor = new PersonPropertyDescriptor(
                        s,
                        new Func<object>(() => { return this[s]; }),
                        new Action<object>(o => { this[s] = o; }));
                propList.Add(descriptor);
            }
Run Code Online (Sandbox Code Playgroud)

问题是每个属性得到它自己的Func和Action但它们都共享外部变量s所以尽管DataGrid自动生成"ID","FirstName","LastName","Age","Gender"的列,它们都得到了设置为"性别",这是foreach循环中s的最终静止值.

如何确保每个委托使用所需的字典密钥,即Func/Action实例化时的s值?

非常感谢.


这是我的其余想法,我只是在这里尝试这些不是'真正'的类......

// DataGrid binds to a People instance
public class People : List<Person>
{
    public People()
    {
        this.Add(new Person());
    }
}

public class Person : Dictionary<string, object>, ICustomTypeDescriptor
{
    private static PropertyDescriptorCollection descriptors;

    public Person() …
Run Code Online (Sandbox Code Playgroud)

c# lambda wpfdatagrid icustomtypedescriptor

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

静态存储库是使用NHibernate的正确方法吗?

我花了剩下的时间阅读StackOverflow问题,还有一些关于这个主题的博客文章和链接.所有这些都证明是非常有帮助的,但我仍然觉得他们并没有真正回答我的问题.

所以,我正在开发一个简单的Web应用程序.我想创建一个可重用的数据访问层,以后我可以在其他解决方案中重用它.其中99%将是Web应用程序.这似乎是我学习NHibernate及其周围模式的一个很好的借口.

我的目标如下:

  • 我不希望业务逻辑层知道关于数据库内部工作的任何内容,也不希望NHibernate本身.
  • 我希望业务逻辑层对数据访问层的假设数量尽可能少.
  • 我希望数据访问层尽可能简单易用.这将是一个简单的项目,所以我不想让任何事情过于复杂.
  • 我希望数据访问层尽可能不具有侵入性.

考虑到这一切,我决定使用流行的存储库模式.我在这个网站和各种开发博客上阅读了这个主题,我听到了一些关于工作单元模式的内容.

我也环顾四周,检查了各种实现.(包括FubuMVC contrib,SharpArchitecture,以及一些博客上的内容.)我发现大多数这些操作都遵循相同的原则:它们创建了一个"工作单元",在实例化存储库时实例化,它们启动一个事务,做东西,提交,然后重新开始.所以,只有一个ISession每次Repository仅此而已.然后客户端代码需要实例化一个存储库,用它做一些东西,然后处理.

这种使用模式不符合我尽可能简单化的需要,所以我开始考虑其他事情.

我发现NHibernate已经有了使自定义"工作单元"实现变得不必要的东西,那就是CurrentSessionContext类.如果我正确配置会话上下文,并在必要时进行清理,我很高兴.

所以,我想出了这个:

我有一个内部静态类叫NHibernateHelper.首先,它有一个名为的静态属性CurrentSessionFactory,在第一次调用时,实例化会话工厂并将其存储在静态字段中.(ISessionFactory每个人一个AppDomain就足够了.)然后,更重要的是,它有一个CurrentSession静态属性,它检查是否ISession绑定到当前会话上下文,如果没有,则创建一个,并绑定它,然后返回ISession绑定到当前的会话上下文.

因为它主要用于WebSessionContext(所以,ISession每个HttpRequest,虽然对于我配置的单元测试ThreadStaticSessionContext),它应该无缝地工作.在创建并绑定an之后ISession,它会将事件处理程序挂钩到HttpContext.Current.ApplicationInstance.EndRequest事件,该事件处理ISession请求结束后的清理.(当然,只有当它真的在Web环境中运行时才会这样做.)

因此,通过所有这些设置,NHibernateHelper将始终能够返回有效的ISession,因此无需为"工作单元"实例化Repository实例以使其正常运行.相反,Repository是与工作的静态类ISessionNHibernateHelper.CurrentSession性能,并通过通用的方法,公开通过该功能.

所以,基本上,我最终得到了两个非常懒惰的单身人士.

我好奇,你怎么看待这个?这是一种有效的思维方式,还是我完全偏离了这里?

编辑:
我必须指出NHibernateHelper类是内部的,因此对于存储库的使用者来说几乎是不可见的.

另一个想法是,为了将依赖注入引入解决方案,就是创建一个名为的接口IDataProvider,并在第一次调用Repository该类时实例化该接口的一个实例.(但是,实现代码也应该能够关注上下文的概念.)

编辑2:
似乎很多人都喜欢我的想法,但在答案中对它的看法仍然太少.
我可以假设这是使用NHibernate的正确方法吗?:P

.net asp.net nhibernate orm repository-pattern

13
推荐指数
1
解决办法
1158
查看次数

如何使用TcpClient获取客户端IP地址?

我正在使用TcpClient在端口上侦听请求.当请求从客户端进来时,我想知道发出请求的客户端ip.

我试过了:

Console.WriteLine(tcpClient.Client.RemoteEndPoint.ToString());
Console.WriteLine(tcpClient.Client.LocalEndPoint.ToString());
var networkStream = tcpClient.GetStream();
var pi = networkStream.GetType().GetProperty("Socket", BindingFlags.NonPublic | BindingFlags.Instance);
var socketIp = ((Socket)pi.GetValue(networkStream, null)).RemoteEndPoint.ToString();
Console.WriteLine(socketIp);
Run Code Online (Sandbox Code Playgroud)

所有这些地址都输出10.xxx地址,这些地址是私有地址,显然不是我网络上发出请求的客户端的地址.如何获取发出请求的客户端的公共IP?

编辑: 我们正在使用带有tcp转发的Amazon EC2负载均衡器.有没有办法在这个设置中获得真正的客户端IP?

.net c# tcpclient

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

避免"变量可能尚未初始化"

我最近遇到了一个看起来像这样的例程:

procedure TMyForm.DoSomething(list: TList<TMyObject>; const flag: boolean);
var
  local: integer;
begin
  if flag then
    //do something
  else local := ExpensiveFunctionCallThatCalculatesSomething;

  //do something else
  for i := 0 to list.Count do
    if flag then
      //do something
    else if list[i].IntValue > local then //WARNING HERE
        //do something else
end;
Run Code Online (Sandbox Code Playgroud)

这使得Variable 'local' might not have been initialized即使你可以通过阅读,除非初始化它的代码分支已经运行,你不会碰到该行代码告诉.

现在,我可以local := 0;在程序的顶部添加一个无用的东西来摆脱这个警告,但我想知道是否可能没有更好的方法来构建它来避免这个问题.有人有主意吗?

delphi refactoring compiler-warnings

12
推荐指数
3
解决办法
4698
查看次数

从电话号码中删除短划线

使用java的正则表达式可用于过滤掉破折号' - '并从表示电话号码的字符串中打开紧密的圆括号...

所以(234)887-9999应该给2348879999,类似地234-887-9999应该给2348879999.

谢谢,

java regex phone-number

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

你对typedef'ing shared_ptr的约定是什么?

我在typedef的boost :: shared_ptr模板的命名约定之间翻转.例如:

typedef boost::shared_ptr<Foo> FooPtr;
Run Code Online (Sandbox Code Playgroud)

在制定一项公约之前,我想看看其他人使用什么.你的约定是什么?

编辑:

对于那些在Foo中嵌入typedef的人来说,Foo现在"意识到"它将如何被传递并不会让你烦恼吗?它似乎打破了封装.这个怎么样:

class Foo
{
public:
    typedef std::vector<Foo> Vector
};
Run Code Online (Sandbox Code Playgroud)

你现在不会这样做,对吗?:-)

c++ boost naming-conventions shared-ptr

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