Roslyn CodeFix和重构之间有什么区别?

时间:2018-07-03 10:37:51

标签: c# roslyn

我一直在寻找关于Roslyn API的所有可能的文档,但是找不到这个简单问题的答案。

我知道CodeFix从CodeFixProvider继承并提供代码修复。 我也知道,重构继承自CodeRefactoringProvider并提供了重构。 我发现的一个区别是,由于某些原因,您不能仅通过VSIX使用Nuget重新分配重构,而可以同时使用两者重新分配CodeFix。

但是什么是代码修复,什么是重构?一个人能做什么而另一个人不能做?

2 个答案:

答案 0 :(得分:1)

代码修复程序用于在代码中识别出错误错误的地方,并可以推断出如何更正

重构是对代码的更改,通常不会或多或少会使正确。提供多种重构将在各种形式之间转换代码的情况并不少见,通常包括回到有人接受任何重构之前的形式。相比之下,在极端情况下很少会找到另一个Code Fix(在同一包中)将代码转换成另一个Code Fix可以应用的形式。

答案 1 :(得分:0)

除了前面的答案外,代码修复和代码重构之间还有另一个功能上的区别。您可以通过覆盖 GetFixAllProvider

轻松地为解决方案范围的代码修补添加支持:
public class PusherService {
    private static final String CHANNEL = "private-User." + accountId;

    private static PusherService instance;
    private Pusher pusher;

    public static synchronized PusherService getInstance() {
        if (instance == null) {
            instance = new PusherService();
        }

        return instance;
    }

    private PusherService() {
        pusher = initiatePusher();
    }

    private static Pusher initiatePusher() {
        HttpAuthorizer httpAuthorizer = new HttpAuthorizer(BuildConfig.PUSHER_AUTH_URL);
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", Session.getToken());
        headers.put("Accept", "application/json");
        headers.put("Content-Type", "application/json");
        httpAuthorizer.setHeaders(headers);

        PusherOptions options = new PusherOptions()
                .setCluster(BuildConfig.PUSHER_CLUSTER)
                .setEncrypted(true)
                .setAuthorizer(httpAuthorizer);

        Pusher pusher = new Pusher(BuildConfig.PUSHER_KEY, options);
        pusher.connect(new ConnectionEventListener() {
            @Override
            public void onConnectionStateChange(ConnectionStateChange connectionStateChange) {
                Log.i("Pusher", "Connection State Change: " + connectionStateChange.getCurrentState().name());
            }

            @Override
            public void onError(String s, String s1, Exception e) {
                Log.i("Pusher", String.format("Connection Error: [%s], exception: [%s]", s, e));
            }
        });

        return pusher;
    }

    public PrivateChannel getChannel() {
        PrivateChannel privateChannel = pusher.getPrivateChannel(CHANNEL);
        if (privateChannel == null) {
            privateChannel = pusher.subscribePrivate(CHANNEL, new PrivateChannelEventListener() {
                @Override
                public void onAuthenticationFailure(String s, Exception e) {
                    // Authentication failed
                    Log.i("Pusher", String.format("Authentication failure due to [%s], exception: [%s]", s, e));
                }

                @Override
                public void onSubscriptionSucceeded(String s) {
                    Log.i("Pusher", "Private connection succeeded");
                }

                @Override
                public void onEvent(String channel, String event, String data) {
                    Log.i("Pusher", data);
                }
            });
        }

        return privateChannel;
    }
}

但是据我所知,没有这么简单的方法来提供大规模重构