小编Spo*_*ook的帖子

Lambda分配局部变量

请考虑以下来源:

static void Main(string[] args)
{
    bool test;

    Action lambda = () => { test = true; };
    lambda();

    if (test)
        Console.WriteLine("Ok.");
}
Run Code Online (Sandbox Code Playgroud)

它应该编译,对吗?嗯,事实并非如此.我的问题是:根据C#标准,这个代码应该编译还是这个编译器错误?


错误消息:

Use of unassigned local variable 'test'
Run Code Online (Sandbox Code Playgroud)

注意:知道,如何修复错误,我部分知道,为什么会发生.但是,无条件地分配了局部变量,我想,编译器应该注意到,但事实并非如此.我想知道为什么.


评论答案:C#允许声明未分配的变量,这实际上非常有用,即.

bool cond1, cond2;
if (someConditions)
{
    cond1 = someOtherConditions1;
    cond2 = someOtherConditions2;
}
else
{
    cond1 = someOtherConditions3;
    cond2 = someOtherConditions4;
}
Run Code Online (Sandbox Code Playgroud)

编译器正确编译了这段代码,我认为,保留未分配的变量实际上会使代码更好一些,因为:

  • 它告诉读者,稍后会分配值(通常可能在以下条件语句中)
  • 强制程序员在内部条件的所有分支中分配变量(如果从一开始就是这个代码的目的),因为如果其中一个分支没有分配其中一个,编译器将拒绝编译代码.

在边缘:这更有趣.考虑C++中的相同示例:

int main(int argc, char * argv[])
{
    bool test;

    /* Comment …
Run Code Online (Sandbox Code Playgroud)

c# c++ lambda compiler-errors local-variables

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

basic_istream <> :: tellg()和basic_ostream <> :: tellp()之间的区别

我只是想知道为什么tellg()basic_istream<>类中tellp()定义并在basic_ostream<>类中定义的成员函数具有不同的名称.这是因为basic_fstream<>是源于basic_istream<>basic_ostream<>吗?

c++ filestream

11
推荐指数
2
解决办法
5026
查看次数

C#优化器性能差吗?

我刚刚写了一个小例子检查,C#的优化器在索引器的情况下表现如何.这个例子很简单 - 我只是将一个数组包装在一个类中并尝试填充它的值:一次直接和一次索引器(内部访问数据的方式与直接解决方案完全相同).

    public class ArrayWrapper
    {
        public ArrayWrapper(int newWidth, int newHeight)
        {
            width = newWidth;
            height = newHeight;

            data = new int[width * height];
        }

        public int this[int x, int y]
        {
            get
            {
                return data[y * width + x];
            }
            set
            {
                data[y * width + x] = value;
            }
        }

        public readonly int width, height;
        public readonly int[] data;
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            ArrayWrapper bigArray = new ArrayWrapper(15000, 15000);

            Stopwatch …
Run Code Online (Sandbox Code Playgroud)

c# performance indexer inlining

11
推荐指数
1
解决办法
781
查看次数

VS Code代码段 - 转义$ {file}

我想在VS Code中创建一个片段,其中包含精确的字符串${code}.但是,当我以这种形式输入时,VS Code会尝试将其解释为片段参数.我应该如何正确地逃脱它?

escaping code-snippets visual-studio-code

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

解决C#中的params

解析传递的可变参数数量时有哪些规则params

假设我有代码:

public void Method(params object[] objects) { }

public void Method(IMyInterface intf, params object[] objects) { }
Run Code Online (Sandbox Code Playgroud)

Method(a, b, c)如果a是IMyInterface,如何解决?我可以确定,C#总是会尝试选择大多数匹配的重载吗?

c# params

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

在Android上重用drawable的部分内容

我正在为我的应用准备drawables.我有很多单选按钮,它们显示为带有可选框架的图像(选中时).一个drawable看起来如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <layer-list>
            <item>
                <shape android:shape="rectangle">
                    <solid android:color="@color/colorPrimary" />
                </shape>
            </item>

            <item>
                <inset android:insetTop="@dimen/selectionBorderSize"
                    android:insetLeft="@dimen/selectionBorderSize"
                    android:insetRight="@dimen/selectionBorderSize"
                    android:insetBottom="@dimen/selectionBorderSize">
                    <layer-list>
                        <item>
                            <shape android:shape="rectangle">
                                <solid android:color="#ffffff"></solid>
                            </shape>
                        </item>
                        <item>
                            <bitmap android:src="@drawable/sharp7" >
                                <padding android:bottom="@dimen/selectionBorderSize"
                                    android:top="@dimen/selectionBorderSize"
                                    android:left="@dimen/selectionBorderSize"
                                    android:right="@dimen/selectionBorderSize" />
                            </bitmap>
                        </item>
                    </layer-list>
                </inset>
            </item>
        </layer-list>
    </item>

    <item android:state_checked="false">
        <layer-list>
            <item>
                <shape android:shape="rectangle">
                    <solid android:color="#ffffff" />
                </shape>
            </item>

            <item>
                <inset android:insetTop="@dimen/selectionBorderSize"
                    android:insetLeft="@dimen/selectionBorderSize"
                    android:insetRight="@dimen/selectionBorderSize"
                    android:insetBottom="@dimen/selectionBorderSize">
                    <layer-list>
                        <item>
                            <shape android:shape="rectangle">
                                <solid android:color="#ffffff"></solid>
                            </shape>
                        </item>
                        <item>
                            <bitmap android:src="@drawable/sharp7" >
                                <padding android:bottom="@dimen/selectionBorderSize"
                                    android:top="@dimen/selectionBorderSize" …
Run Code Online (Sandbox Code Playgroud)

android android-drawable

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

Android,通过可点击的小部件进行手势

我的应用程序包含一个填充按钮的区域.我希望以这种方式实现活动,按钮区域上的fling手势会将其切换到另外两个区域之一(使用ViewFlipper).

我在检测手势方面做了两种方法.第一个涉及使用GestureDetector.但是,Button上的触摸动作事件没有引发onTouchEvent活动方法,所以 - 结果 - 我无法将它转发到GestureDetector类.简而言之,失败.

第二种方法 - 使用GestureOverlayView.然而,这一次,我已经达到了第二个极端:不仅检测到手势,而且执行手势的按钮报告了点击.

我希望界面以下列方式工作:如果用户触摸按钮并释放触摸(或仅略微移动手指),则按钮会报告单击并且未检测到任何手势.另一方面,如果用户触摸屏幕并进行更长时间的移动,则应检测手势并且按钮不报告点击事件.

我已经实现了一个小概念验证应用程序.活动XML代码如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"  xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical">
  <android.gesture.GestureOverlayView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/overlay">
    <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
    <TextView android:id="@+id/display" android:layout_width="match_parent" android:layout_height="wrap_content" />
    <Button android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/button"/>
    </LinearLayout>
  </android.gesture.GestureOverlayView>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

活动java代码如下:

package spk.sketchbook;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.gesture.*;
import android.gesture.GestureOverlayView.OnGestureListener;

public class Main extends Activity implements OnGestureListener, OnClickListener
{       
  private void SetupEvents()
  {
    GestureOverlayView ov = (GestureOverlayView)findViewById(R.id.overlay);
    ov.addOnGestureListener(this); …
Run Code Online (Sandbox Code Playgroud)

user-interface android interface gestures clickable

8
推荐指数
1
解决办法
4377
查看次数

在渲染过程之前确定控件的大小

我有一个由矩形和一些动态创建的标签组成的复合控件(动态,因为在设计时我不知道应该显示多少标签).通过组合整个控件大小,通过依赖属性传递的附加集合以及标签本身的高度,在运行时评估标签的位置(边距).

不幸的是,在渲染之前,我没有采用确定性的方法来确定标签高度.ActualWidth并且ActualHeight被显示在标签0之前,宽度/高度没有设置,因为我希望标签的大小自己立足于自己的内容,DesiredSize返回为0,正确的尺寸或大小超过实际标签尺寸(如2〜3次),RenderSize返回有效大小或0,它就像第一个标签返回有效大小和第二个 - 0.0,没有任何明显的原因.

我试过调用Measure()带有double.PositiveInfinity的标签只是为了达到这种情况,当时的DesiredSize方式比预期的要大(所有标签都有相同的字体,只包含数字,所以它们的大小都要小得多,但首先有~16像素,第二 - ~36,虽然渲染后,RenderSize对他们两个都有效).

在屏幕上呈现之前,是否有确定的方法来检查所需的控件大小,仅基于其内容(而不是对齐/边距)?

size wpf controls

8
推荐指数
1
解决办法
4397
查看次数

Eclipse Juno的GUI Builder

你知道SWT的任何GUI构建器,它与Eclipse Juno(4.2)兼容吗?

eclipse swt gui-builder eclipse-juno

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

如何在Visual Studio中的项目之间共享C++源代码文件?

我正在编写一个跨平台的应用程序.一个版本将在Win32下运行,第二个版本在Windows Phone上运行.

我想重用我的C++核心 - 尤其是内部没有平台依赖,仅限STL.我命令这样做,我想在两个项目中使用相同的源文件:静态Win32库(.lib)和Windows Phone组件(C++/CLI).

如何配置这两个项目以使用完全相同的源文件和头文件?


好的,我们举个例子.比方说,我有项目:

MyApp.Library [win32 lib]
    myClass.cpp
    myClass.h
Run Code Online (Sandbox Code Playgroud)

该库被编译为.DLL文件,然后在Win32应用程序中导入:

MyApp.Win32App [win32 C#]
Run Code Online (Sandbox Code Playgroud)

由于win32与二进制级别的Windows Phone不兼容,我不能直接使用该lib.但由于Library只使用STL,我可以创建Windows Phone组件,将所有源代码放在那里并构建.

MyApp.Component [Windows Phone component]
    myClass.cpp
    myClass.h
Run Code Online (Sandbox Code Playgroud)

我希望这两个文件与库中使用的文件完全相同.我该如何组织项目来实现这种效果?

c++ c++-cli windows-phone visual-studio-2013

8
推荐指数
1
解决办法
5878
查看次数