小编Ian*_*son的帖子

在“with”语句中调用构造函数

我有以下代码:

class Test:

    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print(f'entering {self.name}')

    def __exit__(self, exctype, excinst, exctb) -> bool:
        print(f'exiting {self.name}')
        return True

with Test('first') as test:
    print(f'in {test.name}')

test = Test('second')
with test:
    print(f'in {test.name}')
Run Code Online (Sandbox Code Playgroud)

运行它会产生以下输出:

class Test:

    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print(f'entering {self.name}')

    def __exit__(self, exctype, excinst, exctb) -> bool:
        print(f'exiting {self.name}')
        return True

with Test('first') as test:
    print(f'in {test.name}')

test = Test('second')
with test:
    print(f'in {test.name}')
Run Code Online (Sandbox Code Playgroud)

但我预计它会产生:

entering first
exiting first
entering …
Run Code Online (Sandbox Code Playgroud)

python class with-statement python-3.x

51
推荐指数
2
解决办法
3188
查看次数

Eric Lippert的意思是"您需要知道基类是什么来确定基类是什么"?

我刚刚阅读了Eric Lippert撰写的这篇有趣的文章,十大最差C#特色.接近结束时他说:

在上述结肠之后解决姓名的规则并不充分; 您最终可能需要知道基类是什么,以确定基类是什么.

通过冒号,他指的是继承运算符(例如Dog : Animal).

Eric指的是什么情况?任何人都可以提供代码示例吗?

c# language-design

25
推荐指数
2
解决办法
1313
查看次数

GetValueOrDefault如何工作?

我负责一个LINQ提供程序,它对C#代码执行一些运行时评估.举个例子:

int? thing = null;
accessor.Product.Where(p => p.anInt == thing.GetValueOrDefault(-1))
Run Code Online (Sandbox Code Playgroud)

目前上述代码由于为thingnull 而无法与我的LINQ提供程序一起使用.

虽然我已经使用C#很长时间了,但我不知道如何实现GetValueOrDefault,因此我应该如何解决这个问题.

所以我的问题是:GetValueOrDefault在调用它的实例为空的情况下如何工作?为什么不NullReferenceException抛出?

接下来的问题:我应该如何复制GetValueOrDefault使用反射的调用,因为我需要处理空值.

c# nullable

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

Swift for in循环:使用var get warning来使用let,使用let get error

我在swift文件中有以下代码:

func testDictionary(dict :Dictionary<String,AnyObject>) {
    var str = ""
    for var key in dict.keys {
        str += key + ":" + dict[key]!.description + "\n"
    }
    self.alert("Dict", message: str)
}
Run Code Online (Sandbox Code Playgroud)

上面的代码varfor循环中对用户产生警告,即:

Variable 'key' was never mutated; consider changing to 'let' constant
Run Code Online (Sandbox Code Playgroud)

但是,当我更改为时var,let我收到以下错误:

'let' pattern cannot appear nested in an already immutable context
Run Code Online (Sandbox Code Playgroud)

当建议的更正是编译器错误时,为什么会收到警告?

swift

15
推荐指数
1
解决办法
2798
查看次数

python 中的协议缓冲区:未生成类

我的proto文件如下:

syntax = "proto3";
option csharp_namespace = "Proto";

message FileListRequest {
    repeated File Files = 1;
}

message File {
    string Path = 1;
}

message ImageFile {
    File File = 1;
    Size Size = 2;
    bytes Content = 3;
}

message Size {
    int32 Width = 1;
    int32 Height = 2;
}

message SendNextFile {
    
}
Run Code Online (Sandbox Code Playgroud)

我用以下命令编译它:

protoc --proto_path=. -I . --python_out=..\..\python\Modules\PreloadingIteratorWrapper\ .\filelist.proto
Run Code Online (Sandbox Code Playgroud)

这将创建以下文件:

# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO …
Run Code Online (Sandbox Code Playgroud)

python protocol-buffers

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

Visual Studio 2012 - MSBuild增量构建未检测到更改

我已经定制了一个MSBuild项目,因此默认目标是一个名为"BuildWithExternalReference"的新目标.这个新目标调用另外两个目标; 第一个是自定义目标,称为"BuildExternalReference",它使用外部工具构建DLL.构建的DLL是主项目的引用,它是使用普通的"Build"目标构建的.我已经为'BuildExternalReference'目标设置了Inputs和Outputs属性,因此Inputs引用源文件,输出引用生成的DLL.

在Visual Studio 2012和Visual Studio 2010中,构建在第一次调用时都能正常工作.但是,在后续构建中,如果我更改外部源文件(由"BuildExternalReference"目标输入属性引用),则Visual Studio 2012只会报告"构建:0成功,0失败,1最新,0跳过".Visual Studio 2010继续完美运行.此外,使用MSBuild.exe从命令行构建工作完美.

我知道Visual Studio 2012中的构建系统已经更改,但我无法找到有关对增量构建执行方式的更改的信息.

Visual Studio 2012中是否有任何更改会导致增量构建发生变化?

这是我正在使用的csproj文件的缩减版本:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="BuildWithExternalTool" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <ExternalSourceFiles Include="..\ExternalSourceFiles\\*\*.cs" />
    <ExternalDll Include="..\ExternalSource\External.dll" />
  </ItemGroup>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Target Name="BuildExternalTool" Inputs="@(ExternalSourceFiles);" Outputs="@(ExternalDll)">
    <Exec Command="C:\External\Path\To\Tool.exe" />
  </Target>
  <Target Name="BuildWithExternalTool">
    <CallTarget Targets="BuildExternalTool" />
    <CallTarget Targets="Build" />
  </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

2012年11月1日更新

这是一个完整的自包含示例,可以重现该问题:

https://skydrive.live.com/redir?resid=EA1DD6ACA92F9EFF!155&authkey=!ANhuqF_rrCgxpLE

这是一个项目的解决方案.已自定义MSBuildIssueExample\MSBuildIssueExample.csproj文件,因此存在自定义默认目标.此默认目标调用自定义目标(称为"ExternalTool"),然后调用默认的Build目标.

自定义ExternalTool目标会写出一些消息以确保它正常工作,并且还会通过MSBuildIssueExample\ExternalTool\Output.txt文件复制MSBuildIssueExample\ExternalTool\Input.txt文件的内容.

Input.txt文件是ExternalTool目标的输入,Output.txt是输出.

要重新创建问题,请按照下列步骤操作:

1)在指定版本的Visual Studio中打开解决方案

2)构建解决方案一次,以确保输出相对于输入是最新的

3)修改MSBuildIssueExample\ExternalTool\Input.txt,使其内容与Output.txt不匹配

4)再次建造

在Visual Studio 2010中执行此过程时,将再次调用ExternalTool目标,并将Input.txt文件复制到Output.txt上.

在Visual Studio 2012中执行此过程时,即使输入比输出新,也不会调用ExternalTool目标,因此Input.txt的内容不会写入Output.txt.

但是,如果您执行Rebuild(而不仅仅是Build),则两个版本的Visual Studio都按预期工作.

msbuild incremental-build visual-studio-2012

14
推荐指数
1
解决办法
6240
查看次数

sqlite:sqlite3_column_count始终返回0

我在iOS项目中使用sqlite.但是sqlite3_column_count总是返回0,即使我确定查询确实返回了一些列(我甚至认为SQL中的SELECT查询不可能有零输出列).奇怪的是,这种行为会改变,具体取决于我链接的库的版本,特别是该库使用的编译时选项.

这些是用于库版本的编译时选项,它不起作用:

COMPILER=clang-8.0.0 (clang-800.2.34)
ENABLE_API_ARMOR
ENABLE_FTS3
ENABLE_FTS3_PARENTHESIS
ENABLE_JSON1
ENABLE_LOCKING_STYLE=1
ENABLE_RTREE
ENABLE_UPDATE_DELETE_LIMIT
HAS_CODEC
HAVE_ISNAN
MAX_MMAP_SIZE=20971520
OMIT_AUTORESET
OMIT_BUILTIN_TEST
OMIT_LOAD_EXTENSION
SYSTEM_MALLOC
THREADSAFE=2
Run Code Online (Sandbox Code Playgroud)

以下是适用版本的标志:

COMPILER=clang-8.0.0
SYSTEM_MALLOC
THREADSAFE=1
Run Code Online (Sandbox Code Playgroud)

什么可能导致这种行为?

更新2016/12/01

这是一个可用于重新创建问题的项目:https://github.com/iannewson/Stackoverflow40895740.git

ViewController.swift包含以下代码:

Test.doDbStuff()
Run Code Online (Sandbox Code Playgroud)

此功能包含以下内容:

public static func doDbStuff() {
    do {

        var db :OpaquePointer?
        let dbPath = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
            .appendingPathComponent("\(Date.init().timeIntervalSince1970)".replacingOccurrences(of: ".", with: "") + ".db")
            .path

        var returnCode :Int32 = sqlite3_open(dbPath, &db)
        if SQLITE_OK != returnCode {
            preconditionFailure("Failed to open db")
        }

        var stmt :OpaquePointer? …
Run Code Online (Sandbox Code Playgroud)

sqlite google-analytics-api ios cocoapods

8
推荐指数
0
解决办法
420
查看次数

在Java中尝试/执行模式实现

我是try/do(或trier/doer)模式的粉丝,最好在C#中使用out参数实现,例如:

DateTime date;
if (DateTime.TryParse("2012-06-18", out date))
{
    //Do something with date
}
Run Code Online (Sandbox Code Playgroud)

我正在开发一个Java 1.5项目,为此我正在使用一个名为TryResult的新类来实现try/do模式,该类是从实现try/do模式的任何方法返回的:

public class TryResult<ResultType> {

    private boolean mSuccess = false;
    private ResultType mResult = null;

    public TryResult(boolean success, ResultType result) {
        super();
        this.mSuccess = success;
        this.mResult = result;
    }

    public boolean isSuccess() {
        return mSuccess;
    }

    public ResultType getResult() {
        return mResult;
    }

}
Run Code Online (Sandbox Code Playgroud)

这很好用,但我会将此代码移植到使用J2ME的不同平台,因此泛型不可用.

我目前的选择是从TryResult上面的类中删除泛型并使用普通的旧Object和铸造,或者为我最终使用的类型创建一个新类(例如StringTryResult).

有没有更好的方法在J2ME/Java 1.3上实现这种模式?

java design-patterns java-me

7
推荐指数
1
解决办法
944
查看次数

SQL IN子句,保证评估为false

我可以在SQL IN子句中放置任何值来保证该子句的计算结果为false吗?

SELECT *
FROM Products
WHERE ProductID IN (???)
Run Code Online (Sandbox Code Playgroud)

有什么我可以替换??? 保证不会返回任何行?

sql sql-server sql-in

7
推荐指数
1
解决办法
139
查看次数

具有布尔格式的字符串插值

如何为布尔值指定与其他类型的其他格式字符串一致的格式字符串?

给出以下代码:

double d = Math.PI;
DateTime now = DateTime.Now;
bool isPartyTime = true;

string result = $"{d:0.0}, {now:HH:mm}, time to party? {isPartyTime}";
Run Code Online (Sandbox Code Playgroud)

我可以为每个原始类型指定一种格式,但bool看起来除外。我知道我能做到:

string result = $"{d:0.0}, {now:HH:mm}, time to party? {(isPartyTime ? "yes!" : "no")}";
Run Code Online (Sandbox Code Playgroud)

但这仍然与其他类型不一致。

有没有一种方法可以使插值字符串中的布尔值保持一致?

PS我确实搜索了包含此链接的答案:

/sf/ask/tagged/c/%23+string-interpolation+boolean

令人惊讶的是结果为零。

c# boolean string-interpolation

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